MongoDB とドライバー
定義
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このメソッドでは、次のパラメーターが使われます。
Parameter | タイプ | 説明 |
|---|---|---|
| string | 個別の値を返すフィールド。 |
| ドキュメント | 個別の値を取得するドキュメントを指定するクエリ。 |
| ドキュメント | 任意。 オプションを指定するドキュメント。 「オプション 」を参照してください。 |
注意
結果は BSON サイズの最大を超えることはできません。結果が BSON サイズの最大を超える場合は、「集計パイプラインを使用した個別の値の取得」で説明されているように、$group 演算子を使用して集計パイプラインで個別の値を取得します。
次の図は、distinct() 呼び出しの例を示しています。
オプション
{ collation: <document> }
フィールド | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ドキュメント | 任意。 任意。操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、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 サイズ制限など)については、「本番環境での考慮事項」も参照してください。
クライアントの切断
distinct() を発行したクライアントが操作が完了する前に切断された場合、 MongoDB はkillOp を使用して distinct() を終了としてマークします。
レプリカセット ノードの状態の制限
レプリカセット ノードでdistinct操作を実行するには、ノードがPRIMARYまたはSECONDARY状態である必要があります。 ノードがSTARTUP2などの別の状態にある場合、操作はエラーになります。
クエリ設定
バージョン8.0の新機能。
クエリ設定を使用して、インデックスヒント、操作拒否フィルター、その他のフィールドを設定できます。設定はクラスター全体のクエリシェイプに適用されます。クラスターは、シャットダウン後も設定を保持します。
クエリオプティマイザは、クエリプランニング中の追加入力としてクエリ設定を使用します。これは、クエリを実行するために選択されたプランに影響します。クエリ設定を使用してクエリシェイプをブロックすることもできます。
クエリ設定を追加して例を調べるには、setQuerySettings を参照してください。
find、distinct、aggregate コマンドのクエリ設定を追加できます。
クエリ設定にはより多くの機能があり、廃止されたインデックスフィルターよりも優先されます。
クエリ設定を削除するには、 removeQuerySettingsを使用します。 クエリ設定を取得するには、集計パイプラインの$querySettingsステージを使用します。
例
次の例えでは、sample_mflix データベースの movies コレクションを使用します。
フィールドの個別の値を返す
次の例では、typeフィールドの個別の値を返します。
db.movies.distinct( "type" )
[ 'movie', 'series' ]
埋め込みフィールドの個別の値を返す
次の例では、埋め込まれた imdb.ratingフィールドの個別の値を返します。
db.movies.distinct( "imdb.rating", { title: { $regex: /^Toy Story/ } } )
[ 7.3, 7.6, 7.9, 8.3, 8.4 ]
Tip
埋め込みドキュメント内のフィールドへのアクセスに関する情報は、ドット表記 を参照してください。
配列フィールドの個別の値を返す
次の例では、genres 配列フィールドの個別の値を返します。
db.movies.distinct( "genres", { rated: "G", year: { $gt: 2010 } } )
[ 'Adventure', 'Animation', 'Comedy', 'Documentary', 'Drama', 'Family', 'Fantasy', 'Music', 'Romance', 'Short', 'Sport' ]
distinct() および配列フィールドの詳細については、「動作」セクションを参照してください。
クエリの指定 distinct
次の例では、year が 2000 に等しい ratedフィールドの個別の値を返します。
db.movies.distinct( "rated", { year: 2000 } )
[ 'G', 'PG', 'PG-13', 'R', 'TV-14', 'TV-G', 'TV-PG' ]
照合の指定
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
コレクション movieTitlesDemoは、次のドキュメントを含みます。
db.movieTitlesDemo.insertMany( [ { _id: 1, title: "café", status: "A" }, { _id: 2, title: "cafe", status: "a" }, { _id: 3, title: "cafE", status: "a" } ] )
次の操作にはMongoDB照合 オプションが含まれます。
db.movieTitlesDemo.distinct( "title", {}, { collation: { locale: "fr", strength: 1 } } )
[ 'café' ]
照合フィールドの説明については、照合ドキュメントを参照してください。