MongoDB とドライバー
定義
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
注意
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
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.
For an example, see Return Distinct Values for an Array Field.
インデックスの使用
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などの別の状態にある場合、操作はエラーになります。
クエリ設定
バージョン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' ]
For information on distinct() and array fields, see the Behavior section.
クエリの指定 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é' ]
照合フィールドの説明については、照合ドキュメントを参照してください。