Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

db.collection.distinct()

項目一覧

  • 定義
  • 互換性
  • 構文
  • オプション
  • 動作

MongoDB とドライバー

このページでは、 mongosh メソッドについて説明します。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。

C#Java SyncNode.jsPyMongoC++GoJava RSKotlin CoroutineKotlin SyncPHPMongoidRustScala
db.collection.distinct(field, query, options)

1 つのコレクションまたはビューから指定されたフィールドの個別の値を検索し、その結果を配列で返します。

このメソッドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

注意

このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

このメソッドでは、次のパラメーターが使われます。

Parameter
タイプ
説明

field

string

個別の値を返すフィールド。

query

ドキュメント

個別の値を取得するドキュメントを指定するクエリ。

options

ドキュメント

任意。オプションを指定するドキュメント。 「 オプション 」を参照してください。

注意

結果は BSON サイズの最大を超えることはできません。結果が BSON サイズの最大を超える場合は、「集計パイプラインを使用した個別の値の取得」で説明されているように、$group 演算子を使用して集計パイプラインで個別の値を取得します。

次の図は、 db.collection.distinct()呼び出しの例を示しています。

注釈付きの個別の操作の図。
{ collation: <document> }
フィールド
タイプ
説明

collation

ドキュメント

任意。

操作に使用する照合を指定します。

照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。

照合オプションの構文は次のとおりです。

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

照合を指定する場合、locale フィールドは必須ですが、その他の照合フィールドはすべて任意です。フィールドの説明については、照合ドキュメントを参照してください。

照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合(db.createCollection() を参照)には、コレクションの照合が使用されます。

コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。

1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。

シャーディングされたクラスターでは、 distinctコマンドによって孤立したドキュメントが返される場合があります。

時系列コレクションの場合、distinct コマンドはインデックスを効率的に使用できません。代わりに、$group 集計を使用して、ドキュメントを個別の値でグループ化します。詳細は「時系列の制限」をご覧ください。

指定された field の値が配列の場合、 db.collection.distinct() では配列の各要素が別個の値として扱われます。

たとえば、フィールドの値が [ 1, [1], 1 ] の場合、db.collection.distinct()1[1]1 を別々の値として扱います。

例については、「配列フィールドの個別の値を返す 」を参照してください。

可能な場合、 db.collection.distinct() 操作ではインデックスを使用できます。

インデックスは db.collection.distinct()操作も カバー できます。インデックスによってカバーされるクエリの詳細については、「カバーされたクエリ 」を参照してください。

トランザクション内で個別の操作を実行するには、以下を使用できます。

  • シャーディングされていないコレクションの場合、db.collection.distinct()メソッド/distinctコマンドと、$groupステージの集計パイプラインを使用できます。

  • シャーディングされたコレクションの場合、db.collection.distinct()メソッドまたはdistinctコマンドは使用できません。

    シャーディングされたコレクションの個別の値を検索するには、代わりに $group ステージで集計パイプラインを使用します。詳細については、「個別の操作」を参照してください。

重要

ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。

トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。

MongoDB 4.2以降では、 db.collection.distinct()を発行したクライアントが操作の完了前に切断した場合、MongoDB は killOp を使用してdb.collection.distinct()を終了対象としてマークし

レプリカセット ノードでdistinct操作を実行するには、ノードがPRIMARYまたはSECONDARY状態である必要があります。 ノードがSTARTUP2などの別の状態にある場合、操作はエラーになります。

バージョン8.0の新機能

クエリ設定を使用して、インデックスヒント、操作拒否フィルター、その他のフィールドを設定できます。設定はクラスター全体のクエリシェイプに適用されます。クラスターは、シャットダウン後も設定を保持します。

クエリオプティマイザは、クエリプランニング中の追加入力としてクエリ設定を使用します。これは、クエリを実行するために選択されたプランに影響します。クエリ設定を使用してクエリシェイプをブロックすることもできます。

クエリ設定を追加して例を調べるには、setQuerySettings を参照してください。

finddistinctaggregate コマンドのクエリ設定を追加できます。

クエリ設定にはより多くの機能があり、廃止されたインデックスフィルターよりも優先されます。

クエリ設定を削除するには、 removeQuerySettingsを使用します。 クエリ設定を取得するには、集計パイプラインの$querySettingsステージを使用します。

この例では、次のドキュメントを含む inventory コレクションを使用します。

{ "_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" ] }

次の例では、inventory コレクション内のすべてのドキュメントからフィールド dept の個別の値を返します。

db.inventory.distinct( "dept" )

このメソッドは、次のような個別の dept の値の配列を返します。

[ "A", "B" ]

次の例では、inventory コレクション内のすべてのドキュメントから、item フィールドに埋め込まれたフィールド sku の個別の値を返します。

db.inventory.distinct( "item.sku" )

このメソッドは、次のような個別の sku の値の配列を返します。

[ "111", "222", "333" ]

Tip

以下も参照してください。

埋め込みドキュメント内のフィールドへのアクセスに関する情報は、ドット表記 を参照してください。

次の例では、inventory コレクション内のすべてのドキュメントからフィールド sizes の個別の値を返します。

db.inventory.distinct( "sizes" )

このメソッドは、次のような個別の sizes の値の配列を返します。

[ "M", "S", "L" ]

distinct()および配列フィールドの詳細については、「動作」セクションを参照してください。

次の例では、item フィールドに埋め込まれたフィールド sku の個別の値を、dept"A" に等しいドキュメントから返します。

db.inventory.distinct( "item.sku", { dept: "A" } )

このメソッドは、次のような個別の sku の値の配列を返します。

[ "111", "333" ]

照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。

コレクション myCollは、次のドキュメントを含みます。

{ _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 } } )

照合フィールドの説明については、照合ドキュメントを参照してください。

戻る

db.collection.deleteOne