定義
findクエリを実行し、結果の最初のバッチとカーソル ID を返します。クライアントはその情報からカーソルを作成できます。
Tip
mongoshでは、このコマンドはdb.collection.find()またはdb.collection.findOne()ヘルパー メソッドを通じても実行できます。ヘルパー メソッドは
mongoshユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M0 およびフレックス クラスターで限定的にサポートされています。詳細については、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
find コマンドの構文は次のとおりです。
バージョン 5.0 での変更。
db.runCommand( { find: <string>, filter: <document>, sort: <document>, projection: <document>, hint: <document or string>, skip: <int>, limit: <int>, batchSize: <int>, singleBatch: <bool>, comment: <any>, maxTimeMS: <int>, readConcern: <document>, max: <document>, min: <document>, returnKey: <bool>, showRecordId: <bool>, tailable: <bool>, oplogReplay: <bool>, noCursorTimeout: <bool>, awaitData: <bool>, allowPartialResults: <bool>, collation: <document>, allowDiskUse : <bool>, let: <document> // Added in MongoDB 5.0 } )
コマンドフィールド
このコマンドは、次のフィールドを受け入れます。
フィールド | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| string | クエリするコレクションまたはビューの名前。 | ||||||||||
| ドキュメント | 任意。クエリ述語。指定しない場合は、コレクション内のすべてのドキュメントがその述語と一致します。 | ||||||||||
ドキュメント | 任意。結果の順序の並び替え指定。 | |||||||||||
| ドキュメント | 任意。返される文書に含めるフィールドを決定するためのプロジェクション仕様。 | ||||||||||
| 文字列またはドキュメント | 任意。インデックスの仕様。インデックス名を 文字列またはインデックス キー パターンを指定します。指定すると、クエリ システムはヒント指定したインデックスを使用するプランのみを考慮します。 次の例外を除き、コマンドに | ||||||||||
| 正の整数 | 任意。スキップするドキュメントの数。デフォルトは 0 です。 | ||||||||||
| Non-negative integer | 任意。返されるドキュメントの最大数。指定しない場合、デフォルトは制限なしになります。limit の値が 0 の場合、制限を設定しない場合と同等です。 | ||||||||||
| non-negative integer | 任意。クエリ結果の各バッチで返されることができるドキュメントの最大数。デフォルトでは、
以前のワイヤプロトコルバージョンとは異なり、1 コマンドの | ||||||||||
| ブール値 | 任意。最初のバッチするの後にカーソルを閉じるかどうかを決定します。デフォルトは false です。 | ||||||||||
| any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。
コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。
| ||||||||||
| non-negative integer | 任意。 時間制限をミリ秒単位で指定します。 MongoDB は、
| ||||||||||
| ドキュメント | 任意。読み取り保証 (read concern) を指定します。
次の読み取り保証レベルが利用できます。
読み取り保証 (read concern) のレベルについて詳しくは、「読み取り保証 (read concern) レベル」を参照してください。
| ||||||||||
| ドキュメント | 任意。特定のインデックスの排他的上限。詳細については、「
| ||||||||||
| ドキュメント | 任意。特定のインデックスの包括的下限。詳細については、「
| ||||||||||
| ブール値 | 任意。 true の場合、結果のドキュメントに含まれるインデックスキーのみを返します。 デフォルト値は false です。 returnKey が true | ||||||||||
| ブール値 | 任意。各ドキュメントのレコード識別子を返すかどうかを決定します。true の場合、返されるドキュメントにフィールド $recordId が追加されます。 | ||||||||||
| ブール値 | 任意。上限付きコレクションの追尾可能 (tailable) カーソルを返します。 | ||||||||||
| ブール値 | |||||||||||
| ブール値 | 任意。 サーバーが非アクティブ アイドル期間後に非セッション アイドル30 カーソルをタイムアウトしないようにします。セッションの一部であるカーソルに対しては無視されます。 詳細については、「 セッション アイドル タイムアウト 」を参照してください。 | ||||||||||
ブール値 | 任意。シャーディングされたコレクションに対するクエリで、クエリされたシャードが 1 つ以上使用できない場合に、コマンド(または後続の
| |||||||||||
| ドキュメント | 任意。 操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 | ||||||||||
ブール値 | 任意。 このオプションを使用して、特定のクエリの
MongoDB 6.0 以降では、 詳細については、
大規模なインメモリソートのメモリ制限についての詳細は、「ソートとインデックスの使用」をご覧ください。 | |||||||||||
ドキュメント | 任意。 変数のリストを含むドキュメントを指定します。これにより、変数をクエリテキストから分離することで、コマンドの読みやすさを向上させることができます。 ドキュメントの構文は次のとおりです。 変数は式によって返された値に設定され、その後は変更できません。 コマンド内の変数の値にアクセスするには、二重ドル記号の接頭辞( 結果のフィルタリングに変数を使用するには、
バージョン 5.0 で追加 |
出力
このコマンドは、カーソルIDやドキュメントの最初のバッチするなどのカーソル情報を含むドキュメントを返します。例、 コマンドは、シャーディングされたコレクションに対して実行されると、次のドキュメントを返します。
{ "cursor" : { "firstBatch" : [ { "_id" : ObjectId("5e8e2ca217b5324fa9847435"), "zipcode" : "20001", "x" : 1 }, { "_id" : ObjectId("5e8e2ca517b5324fa9847436"), "zipcode" : "30001", "x" : 1 } ], "partialResultsReturned" : true, "id" : Long("668860441858272439"), "ns" : "test.contacts" }, "ok" : 1, "operationTime" : Timestamp(1586380205, 1), "$clusterTime" : { "clusterTime" : Timestamp(1586380225, 2), "signature" : { "hash" : BinData(0,"aI/jWsUVUSkMw8id+A+AVVTQh9Y="), "keyId" : Long("6813364731999420435") } } }
フィールド | 説明 |
|---|---|
| カーソル クエリされたシャードが使用できないために、シャーディングされたコレクションに対する操作で部分的な結果が返される場合、 クエリされたシャードが最初は |
| コマンドが成功( |
前述の find 固有のフィールドに加えて、db.runCommand() にはレプリカセットとシャーディングされたクラスターに関する次の情報が含まれています。
$clusterTimeoperationTime
詳細については、「db.runCommand() 」の結果を参照してください。
生のコマンド応答が必要ない場合は、db.collection.find() またはdb.collection.findOne() ヘルパーメソッドを使用します。
動作
次のセクションでは、find() コマンドの動作に関する考慮事項について説明します。
操作の順序
MongoDB通常、次の操作順序で find()操作の出力が生成されます。
一致
sort
スキップ
limit
プロジェクト
MongoDB、上記の操作順序を維持しつつクエリ パフォーマンスを最適化するために、コンポーネントを別の順序で実行する場合があります。
$regex Find クエリが無効な正規表現を無視しなくなりました
MongoDB 5.1 以降、無効な $regex options オプションが無視されなくなりました。この変更により、$regex options は、aggregate コマンドおよびプロジェクション クエリでの $regex の使用との一貫性が向上します。
セッション
セッション内で作成されたカーソルの場合、セッション外で getMore を呼び出すことはできません。
同様に、セッション外で作成されたカーソルの場合、セッション内で getMore を呼び出すことはできません。
セッション アイドル タイムアウト
MongoDB ドライバーとmongosh では、確認されていない書込み操作を除くすべての操作がサーバー セッションに関連付けられます。セッションに明示的に関連付けられていない操作(つまり Mongo.startSession()を使用するもの)の場合、MongoDB ドライバーとmongoshによって暗黙的なセッションが作成され、それが操作に関連付けられます。
セッションが30分以上アイドル状態になると、MongoDBサーバーはそのセッションを期限切れとしてマークし、いつでも閉じる可能性があります。MongoDB サーバーでセッションが閉じると、そのセッションで進行中の操作や開いているカーソルもすべて終了します。これには、noCursorTimeout() や 30 分を超える maxTimeMS() で構成されたカーソルも含まれます。
カーソルを返す操作の場合、カーソルが 30 分以上アイドル状態になる可能性がある場合は、 Mongo.startSession() を使用して明示的なセッション内で操作を発行し、 refreshSessions コマンドを使用して定期的にセッションを更新します。詳細については、セッションアイドルタイムアウトを参照してください。
トランザクション
find は分散トランザクション内で使用できます。
トランザクションの外部で作成されたカーソルの場合、トランザクション内で
getMoreを呼び出せません。トランザクション内で作成されたカーソルの場合、トランザクション外で
getMoreを呼び出せません。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
クライアントの切断
操作が完了する前にfindを発行したクライアントが切断された場合、MongoDB はfindをkillOpを使用して終了対象としてマークします。
Stable API
Stable API V1 を使用する場合、次の find コマンド フィールドはサポートされません。
awaitDatamaxminnoCursorTimeoutoplogReplayreturnKeyshowRecordIdtailable
インデックスフィルターと照合
MongoDB 6.0 以降、インデックス フィルターは、以前はplanCacheSetFilter コマンドを使用して設定されていた照合を使用します。
MongoDB 8.0以降では、インデックス フィルターを追加する 代わりに、 クエリ設定を使用します 。 インデックス フィルターは MongoDB 8.0以降非推奨です。
クエリ設定は、インデックス フィルターよりも多くの機能を持ちます。 また、インデックス フィルターは永続的ではなく、すべてのクラスター ノードに対してインデックス フィルターを簡単に作成することはできません。 クエリ設定を追加して例を探すには、 setQuerySettingsを参照してください。
ビューでのカーソルの動作の特定
MongoDB7.3 以降、 オプションとsingleBatch: true batchSize: 1オプションを持つビューで find コマンドを使用すると、カーソルは返されなくなります。MongoDB の以前のバージョンでは、単一のバッチオプションをtrueに設定しても、これらの検索クエリはカーソルを返していました。
クエリ設定
バージョン8.0の新機能。
クエリ設定を使用して、インデックスヒント、操作拒否フィルター、その他のフィールドを設定できます。設定はクラスター全体のクエリシェイプに適用されます。クラスターは、シャットダウン後も設定を保持します。
クエリオプティマイザは、クエリプランニング中の追加入力としてクエリ設定を使用します。これは、クエリを実行するために選択されたプランに影響します。クエリ設定を使用してクエリシェイプをブロックすることもできます。
クエリ設定を追加して例を調べるには、setQuerySettings を参照してください。
find、distinct、および aggregate コマンドのクエリ設定を追加できます。
クエリ設定にはより多くの機能があり、廃止されたインデックスフィルターよりも優先されます。
クエリ設定を削除するには、 removeQuerySettingsを使用します。 クエリ設定を取得するには、集計パイプラインの$querySettingsステージを使用します。
例
ソートと制限の指定
次のコマンドは、rating フィールドと cuisine フィールドでフィルタリングする find コマンドを実行します。このコマンドには、一致するドキュメント内の _id フィールド、name フィールド、rating フィールド、および address フィールドのみを返す projection が含まれています。
このコマンドは、結果セット内のドキュメントを name フィールドでソートし、結果セットを 5 つのドキュメントに制限します。
db.runCommand( { find: "restaurants", filter: { rating: { $gte: 9 }, cuisine: "italian" }, projection: { name: 1, rating: 1, address: 1 }, sort: { name: 1 }, limit: 5 } )
デフォルトの読み取り保証を上書き
デフォルトの読み取り保証 (read concern) レベル "local" を無効にするには、readConcern オプションを使用します。
レプリカセットに対する次の操作では、大多数のノードに書き込まれたことが確認されたデータの最新のコピーを読み取るために、読み取り保証"majority" を指定します。
db.runCommand( { find: "restaurants", filter: { rating: { $lt: 5 } }, readConcern: { level: "majority" } } )
読み取り保証のレベルを問わず、ノード上の最新データにシステム内のデータの最新バージョンが反映されていない場合があります。
getMore コマンドは、元の find コマンドで指定された readConcern レベルを使用します。
cursor.readConcern() メソッドを使用して、mongosh メソッドの db.collection.find() に readConcern を指定できます。
db.restaurants.find( { rating: { $lt: 5 } } ).readConcern("majority")
読み取り保証(read concern)の詳細については、「読み取り保証(read concern)」を参照してください。
照合の指定
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
次の操作は、指定された照合で find コマンドを実行します。
db.runCommand( { find: "myColl", filter: { category: "cafe", status: "a" }, sort: { category: 1 }, collation: { locale: "fr", strength: 1 } } )
mongosh は、db.collection.find() 操作の照合を指定するために cursor.collation() を提供します。
変数の使用 let
バージョン 5.0 で追加
コマンド内の他の場所からアクセスできる変数を定義するには let オプションを使用します。
注意
変数を使用して結果をフィルタリングするには、$expr 演算子内の変数にアクセスする必要があります。
コレクション cakeFlavors を以下ように作成します。
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
次の例では、let で targetFlavor 変数を定義し、その変数を使用してチョコレート ケーキの風味を検索します。
db.cakeFlavors.runCommand( { find: db.cakeFlavors.getName(), filter: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, let : { targetFlavor: "chocolate" } } )