定義
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このメソッドでは、次のパラメーターが使われます。
Parameter | タイプ | 説明 |
|---|---|---|
| string | 個別の値を返すフィールド。 |
| ドキュメント | 個別の値を取得するドキュメントを指定するクエリ。 |
| ドキュメント | Optional. A document that specifies the options. See Options. |
注意
結果は BSON サイズの最大を超えることはできません。結果が BSON サイズの最大を超える場合は、「集計パイプラインを使用した個別の値の取得」で説明されているように、$group 演算子を使用して集計パイプラインで個別の値を取得します。
次の図は、distinct() 呼び出しの例を示しています。
オプション
{ collation: <document> }
フィールド | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ドキュメント | 任意。 任意。操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 |
動作
シャーディングされたクラスターでは、 distinctコマンドによって孤立したドキュメントが返される場合があります。
時系列コレクションの場合、distinct コマンドはインデックスを効率的に使用できません。代わりに、$group 集計を使用して、ドキュメントを個別の値でグループ化します。詳細は「時系列の制限」をご覧ください。
配列フィールド
If the value of the specified field is an array, db.collection.distinct() considers each element of the array as a separate value.
For instance, if a field has as its value [ 1, [1], 1 ], then db.collection.distinct() considers 1, [1], and 1 as separate values.
例については、「配列フィールドの個別の値を返す」を参照してください。
インデックスの使用
When possible, db.collection.distinct() operations can use indexes.
Indexes can also cover db.collection.distinct() operations. See Run Covered Queries for more information on queries covered by indexes.
トランザクション
トランザクション内で個別の操作を実行するには、以下を使用できます。
For unsharded collections, you can use the
db.collection.distinct()method/thedistinctcommand as well as the aggregation pipeline with the$groupstage.For sharded collections, you cannot use the
db.collection.distinct()method or thedistinctcommand.シャーディングされたコレクションの個別の値を検索するには、代わりに
$groupステージで集計パイプラインを使用します。詳細については、「個別の操作」を参照してください。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
クライアントの切断
distinct() を発行したクライアントが操作が完了する前に切断された場合、 MongoDB はkillOp を使用して distinct() を終了としてマークします。
レプリカセット ノードの状態の制限
レプリカセット ノードでdistinct操作を実行するには、ノードがPRIMARYまたはSECONDARY状態である必要があります。 ノードがSTARTUP2などの別の状態にある場合、操作はエラーになります。
例
この例では、次のドキュメントを含む inventory コレクションを使用します。
db.inventory.insertMany( [ { _id: 1, dept: "A", item: { sku: "111", color: "red" }, sizes: [ "S", "M" ] }, { _id: 2, dept: "A", item: { sku: "111", color: "blue" }, sizes: [ "M", "L" ] }, { _id: 3, dept: "B", item: { sku: "222", color: "blue" }, sizes: "S" }, { _id: 4, dept: "A", item: { sku: "333", color: "black" }, sizes: [ "S" ] } ] )
フィールドの個別の値を返す
次の例では、deptフィールドの個別の値を返します。
db.inventory.distinct( "dept" )
この操作では以下が返されます。
[ "A", "B" ]
埋め込みフィールドの個別の値を返す
次の例では、埋め込まれた item.skuフィールドの個別の値を返します。
db.inventory.distinct( "item.sku" )
この操作では以下が返されます。
[ "111", "222", "333" ]
Tip
埋め込みドキュメント内のフィールドへのアクセスに関する情報は、ドット表記 を参照してください。
配列フィールドの個別の値を返す
次の例では、sizes 配列フィールドの個別の値を返します。
db.inventory.distinct( "sizes" )
この操作では以下が返されます。
[ "M", "S", "L" ]
For information on distinct() and array fields, see the Behavior section.
クエリの指定 distinct
次の例では、dept が "A" に等しい埋め込み item.skuフィールドに個別の値を返します。
db.inventory.distinct( "item.sku", { dept: "A" } )
この操作では以下が返されます。
[ "111", "333" ]
照合の指定
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
コレクション myCollは、次のドキュメントを含みます。
db.myColl.insertMany( [ { _id: 1, category: "café", status: "A" }, { _id: 2, category: "cafe", status: "a" }, { _id: 3, category: "cafE", status: "a" } ] )
下記の集計操作には 照合オプションが含まれます。
db.myColl.distinct( "category", {}, { collation: { locale: "fr", strength: 1 } } )
照合フィールドの説明については、照合ドキュメントを参照してください。