db.collection.find()
MongoDB とドライバー
このページでは、 mongosh
メソッドについて説明します。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
定義
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M 0 、M 2 、および M 5クラスターで限定的にサポートされています。 詳細については、「サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
find()
メソッドの形式は次のとおりです。
db.collection.find( <query>, <projection>, <options> )
find()
メソッドは次のパラメーターを取ります。
Parameter | タイプ | 説明 |
---|---|---|
ドキュメント | 任意。クエリ演算子を使用して選択フィルターを指定します。コレクション内のすべてのドキュメントを返すには、このパラメーターを省略するか、空のドキュメント( | |
ドキュメント | 任意。 クエリフィルターに一致するドキュメントで返されるフィールドを指定します。 一致するドキュメント内のすべてのフィールドを返すには、このパラメーターを省略します。 詳細については、「プロジェクション 」を参照してください。 | |
ドキュメント | 任意。クエリの追加オプションを指定します。これらのオプションを使って、クエリの動作と結果が返却される方法を変更します。詳細については、「オプション」を参照してください。 |
動作
プロジェクション
重要
言語の整合性
find()
と findAndModify()
のプロジェクションを集計の $project
ステージと一貫性を持たせるために、
find()
とfindAndModify()
のプロジェクションでは集計式と構文を受け付けます。MongoDB は、プロジェクションに関して追加の制限を適用します。詳細については、「プロジェクションの制限」を参照してください。
projection
パラメーターにより、一致するドキュメントで返されるフィールドが決定されます。projection
パラメーターは以下の形式のドキュメントです。
{ <field1>: <value>, <field2>: <value> ... }
プロジェクション | 説明 |
---|---|
<field>: <1 or true> | フィールドを包含することを指定します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を true として処理します。 |
<field>: <0 or false> | フィールドの除外を指定します。 |
"<field>.$": <1 or true> | |
<field>: <array projection> | 配列プロジェクション 演算子( ビューには使用できません。 |
<field>: <$meta expression> |
ビューには使用できません。 |
<field>: <aggregation expression> | プロジェクションを行ったフィールドの値を指定します。 集計式と構文の使用(リテラルと集計変数の使用を含む)では、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。
|
オプション
オプション | 説明 |
---|---|
allowDiskUse | 実行に 100 メガバイト以上のメモリを必要とするパイプラインが、ディスク上の一時ファイルに書き込むかどうか。詳細については、 cursor.allowDiskUse() を参照してください。 |
allowPartialResults | シャーディングされたコレクションに対するクエリで、クエリされたシャードが 1 つ以上使用できない場合に、コマンド(または後続の getMore コマンド)がエラーではなく部分的な結果を返します。 |
awaitData | カーソルが tailable-await カーソルの場合。 tailable が true である必要があります。 |
collation | 更新操作の照合設定。 |
comment | プロファイラー ログに表示されるクエリに $comment を追加します。 |
explain | 指定した冗長モードに基づいて explain の出力を追加します。 |
hint | クエリオプティマイザがクエリ内で特定のインデックスを使用するように強制します。 |
limit | 結果セットで返されるドキュメントの制限を設定します。 |
最大 | 特定のインデックスの排他的上限。 |
maxAwaitTimeMS | 新しいドキュメントが追尾可能 (tailable) カーソルクエリを満たすまでにサーバーが待機する最大時間。 tailable と awaitData が true である必要があります。 |
maxTimeMS | サーバーがクエリの実行を許可する最大時間(ミリ秒単位)。 |
min | 特定のインデックスの包括的下限。 |
noCursorTimeout | サーバーが非アクティブな期間の後にカーソルをタイムアウトするかどうか(デフォルトでは10分)。 |
ReadConcern | クエリの読み取り保証(read concern)レベルを指定します。 |
readPreference | クエリの読み込み設定(read preference)レベルを指定します。 |
returnKey | クエリに対してインデックス キーのみが返されるかどうかの指定。 |
showRecordId | 返されたドキュメントに $recordId フィールドが追加された場合、$recordId は結果セット内のドキュメントの位置を示します。 |
スキップ | 結果セットの最初のドキュメントを返す前にスキップするドキュメントの数。 |
sort | 結果セットで返されるドキュメントの順序。ソートで指定されたフィールドにはインデックスが必要です。 |
tailable | カーソルが追尾可能かどうかを示します。クエリの初期結果が使い果たされた後も、追尾可能なカーソルはオープンしたままになります。追尾可能(tailable)なカーソルは、上限付きコレクションでのみ使用できます。 |
埋め込みフィールド仕様
埋め込みドキュメント内のフィールドの場合は、次のいずれかを使用してフィールドを指定できます。
ドット表記の場合は次のようになります。
"field.nestedfield": <value>
ネストされた形式の例
{ field: { nestedfield: <value> } }
_id
フィールドプロジェクション
_id
フィールドは、プロジェクションで _id: 0
を明示的に指定して抑制しない限り、返されるドキュメントにデフォルトで含まれます。
包含または除外
projection
には、 _id
フィールドを除いて、包含指定と除外指定の両方を含めることはできません。
フィールドを明示的に含めるプロジェクションでは、
_id
フィールドだけが明示的に除外できる唯一のフィールドです。フィールドを明示的に除外するプロジェクションでは、
_id
フィールドが明示的に包含できる唯一のフィールドですが、デフォルトで_id
フィールドが含まれます。
Cursor Handling
db.collection.find()
を mongosh
で実行すると、カーソルが自動的に反復され、最初の 20 件のドキュメントが表示されます。「 it
」と入力して反復を続行します。
ドライバーを使用して返されたドキュメントにアクセスするには、ドライバー言語に適したカーソル処理メカニズムを使用します。
読み取り保証(read concern)
読み取り保証(read concern)を db.collection.find()
に対して指定するには、cursor.readConcern()
メソッドを使用します。
型のブラケット処理
MongoDB は、一部のデータ型を比較の目的で同等と見なします。たとえば、数値型は比較する前に変換されます。しかし、ほとんどのデータ型において、比較演算子 は、ターゲットフィールドの BSON 型がクエリオペランドの型と一致するドキュメントに対してのみ比較を行います。次のコレクションを考えてみましょう。
{ "_id": "apples", "qty": 5 } { "_id": "bananas", "qty": 7 } { "_id": "oranges", "qty": { "in stock": 8, "ordered": 12 } } { "_id": "avocados", "qty": "fourteen" }
次のクエリは、$gt
を使用して、 qty
の値が4
より大きいドキュメントを返します。
db.collection.find( { qty: { $gt: 4 } } )
このクエリでは次のドキュメントが返されます。
{ "_id": "apples", "qty": 5 } { "_id": "bananas", "qty": 7 }
_id
が "avocados"
に等しいドキュメントは、その qty
値が string
型であるのに対し、 $gt
オペランドが integer
型であるため、返されません。
_id
が "oranges"
と等しいドキュメントは、qty
値が object
型であるため、返されません。
注意
コレクション内のデータ型を強制するには、スキーマ検証を使用します。
セッション
セッション内で作成されたカーソルの場合、セッション外で getMore
を呼び出すことはできません。
同様に、セッション外で作成されたカーソルの場合、セッション内で getMore
を呼び出すことはできません。
セッション アイドル タイムアウト
MongoDB ドライバーとmongosh
では、確認されていない書込み操作を除くすべての操作がサーバー セッションに関連付けられます。セッションに明示的に関連付けられていない操作(つまり Mongo.startSession()
を使用するもの)の場合、MongoDB ドライバーとmongosh
によって暗黙的なセッションが作成され、それが操作に関連付けられます。
セッションが30分以上アイドル状態になると、MongoDBサーバーはそのセッションを期限切れとしてマークし、いつでも閉じる可能性があります。MongoDB サーバーでセッションが閉じると、そのセッションで進行中の操作や開いているカーソルもすべて終了します。これには、noCursorTimeout()
や 30 分を超える maxTimeMS()
で構成されたカーソルも含まれます。
30 分以上アイドル状態になる可能性がある操作の場合は、 Mongo.startSession()
を使用して操作を明示的なセッションに関連付け、refreshSessions
コマンドを使用して定期的にセッションを更新してください。詳細については、「セッションアイドルタイムアウト」を参照してください。
トランザクション
db.collection.find()
は分散トランザクション内で使用できます。
トランザクションの外部で作成されたカーソルの場合、トランザクション内で
getMore
を呼び出せません。トランザクション内で作成されたカーソルの場合、トランザクション外で
getMore
を呼び出せません。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
クライアントの切断
MongoDB 4.2以降では、 db.collection.find()
を発行したクライアントが操作の完了前に切断した場合、MongoDB は killOp
を使用してdb.collection.find()
を終了対象としてマークし 。
クエリ設定
バージョン8.0の新機能。
クエリ設定を使用して、インデックスヒント、操作拒否フィルター、その他のフィールドを設定できます。設定はクラスター全体のクエリシェイプに適用されます。クラスターは、シャットダウン後も設定を保持します。
クエリオプティマイザは、クエリプランニング中の追加入力としてクエリ設定を使用します。これは、クエリを実行するために選択されたプランに影響します。クエリ設定を使用してクエリシェイプをブロックすることもできます。
クエリ設定を追加して例を調べるには、setQuerySettings
を参照してください。
find
、distinct
、aggregate
コマンドのクエリ設定を追加できます。
クエリ設定にはより多くの機能があり、廃止されたインデックスフィルターよりも優先されます。
クエリ設定を削除するには、 removeQuerySettings
を使用します。 クエリ設定を取得するには、集計パイプラインの$querySettings
ステージを使用します。
例
このセクションの例では、bios コレクションのドキュメントを使用します。ドキュメントは通常、次のような形式になります。
{ "_id" : <value>, "name" : { "first" : <string>, "last" : <string> }, // embedded document "birth" : <ISODate>, "death" : <ISODate>, "contribs" : [ <string>, ... ], // Array of Strings "awards" : [ { "award" : <string>, year: <number>, by: <string> } // Array of embedded documents ... ] }
bios
コレクションを作成してデータを入力するには、「 bios コレクション」を参照してください。
コレクション内の全ドキュメントの検索
パラメータのないfind()
メソッドは、コレクションからすべてのドキュメントを返し、ドキュメントのすべてのフィールドを返します。 たとえば、次の操作はbios コレクション内のすべてのドキュメントを返します。
db.bios.find()
クエリ条件に一致するドキュメントの検索
等価を検索するクエリ
次の操作は、bios コレクション内の
_id
が5
に等しいドキュメントを返します。db.bios.find( { _id: 5 } ) 次の操作は、埋め込みドキュメント
name
内のフィールドlast
が"Hopper"
に等しい bios コレクション内のドキュメントを返します。db.bios.find( { "name.last": "Hopper" } ) 注意
埋め込みドキュメントのフィールドにアクセスするには、ドット表記(
"<embedded document>.<field>"
)を使用します。
演算子を使用したクエリ
選択基準のセットに一致するドキュメントを検索するには、<criteria>
パラメーターを指定して find()
を呼び出します。
MongoDB は、条件を指定するためのさまざまなクエリ演算子を提供します。
次の操作では、
$in
演算子を使用して、_id
が5
またはObjectId("507c35dd8fada716c89d0013")
に等しい bios コレクション内のドキュメントを返します。db.bios.find( { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } } ) 次の操作では、
$gt
演算子を使用して、birth
がnew Date('1950-01-01')
より大きいbios
コレクションのすべてのドキュメントを返します。db.bios.find( { birth: { $gt: new Date('1950-01-01') } } ) 次の操作では、
$regex
演算子を使用して、name.last
フィールドが文字N
で始まる(または"LIKE N%"
である)bios コレクション内のドキュメントを返します。db.bios.find( { "name.last": { $regex: /^N/ } } )
クエリ演算子のリストについては、「クエリ セレクター」を参照してください。
範囲のクエリ
比較演算子を組み合わせて、フィールドの範囲を指定します。次の操作は、bios コレクションから、birth
が new Date('1940-01-01')
と new Date('1960-01-01')
の間(排他的)にあるドキュメントを返します。
db.bios.find( { birth: { $gt: new Date('1940-01-01'), $lt: new Date('1960-01-01') } } )
クエリ演算子のリストについては、「クエリ セレクター」を参照してください。
複数条件のクエリ
次の操作は、bios コレクション から birth
フィールドがgreater than
new Date('1950-01-01')
であり、death
フィールドが存在しないすべてのドキュメントを返します。
db.bios.find( { birth: { $gt: new Date('1920-01-01') }, death: { $exists: false } } )
クエリ演算子のリストについては、「クエリ セレクター」を参照してください。
1 つのドキュメントの 2 つのフィールドの比較
$expr
は、同じドキュメントのフィールドを比較する式を含めることができます。
これらのドキュメントを使用して monthlyBudget
コレクションを作成します。
db.monthlyBudget.insertMany( [ { _id : 1, category : "food", budget : 400, spent : 450 }, { _id : 2, category : "drinks", budget : 100, spent : 150 }, { _id : 3, category : "clothes", budget : 100, spent : 50 }, { _id : 4, category : "misc", budget : 500, spent : 300 }, { _id : 5, category : "travel", budget : 200, spent : 650 } ] )
次の操作では、 $expr
を使用して、 spent
の量がbudget
を超えるドキュメントを検索します。
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
出力:
{ _id : 1, category : "food", budget : 400, spent : 450 } { _id : 2, category : "drinks", budget : 100, spent : 150 } { _id : 5, category : "travel", budget : 200, spent : 650 }
埋め込みドキュメントのクエリ
次の例では、bios コレクション内のname
埋め込みフィールドに対してクエリを実行します。
埋め込みドキュメントに対する完全一致のクエリ
次の操作は、 bios コレクション内で埋め込みドキュメント name
が { first: "Yukihiro", last: "Matsumoto" }
と順序も含めて完全に一致するドキュメントを返します。
db.bios.find( { name: { first: "Yukihiro", last: "Matsumoto" } } )
name
フィールドは埋め込みドキュメントと完全に一致する必要があります。このクエリでは、次の name
フィールドを持つドキュメントには一致しません。
{ first: "Yukihiro", aka: "Matz", last: "Matsumoto" } { last: "Matsumoto", first: "Yukihiro" }
埋め込みドキュメントのクエリ フィールド
次の操作は、埋め込みドキュメント name
に値 "Yukihiro"
を持つフィールド first
、および値 "Matsumoto"
を持つフィールド last
が含まれる bios コレクション内のドキュメントを返します。このクエリは、ドット表記を使用して埋め込みドキュメントのフィールドにアクセスします。
db.bios.find( { "name.first": "Yukihiro", "name.last": "Matsumoto" } )
このクエリは、name
フィールドが、フィールド first
に値 "Yukihiro"
を、フィールド last
に値 "Matsumoto"
を含む埋め込みドキュメントを持つドキュメントに一致します。たとえば、このクエリは、次のいずれかの値を持つ name
フィールドを含むドキュメントと一致します。
{ first: "Yukihiro", aka: "Matz", last: "Matsumoto" } { last: "Matsumoto", first: "Yukihiro" }
詳細と例については、「埋め込みおよびネストされたドキュメントに対するクエリ」も参照してください。
クエリ配列
配列要素のクエリ
次の例では、bios コレクション内のcontribs
配列に対してクエリを実行します。
次の操作は、配列フィールド
contribs
に要素"UNIX"
が含まれる bios コレクション内のドキュメントを返します。db.bios.find( { contribs: "UNIX" } ) 次の操作は、配列フィールド
contribs
に要素"ALGOL"
または"Lisp"
が含まれる bios コレクション内のドキュメントを返します。db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } ) 次の操作では、
$all
クエリ演算子を使用して、配列フィールドcontribs
に要素"ALGOL"
と"Lisp"
の両方が含まれる bios コレクション内のドキュメントを返します。db.bios.find( { contribs: { $all: [ "ALGOL", "Lisp" ] } } ) その他の例については、「
$all
」を参照してください。「$elemMatch
」も参照してください。次の操作では、
$size
演算子を使用して、contribs
の配列サイズが 4 である bios コレクション 内のドキュメントを返します。db.bios.find( { contribs: { $size: 4 } } )
配列のクエリについての詳細と例については、次を参照してください。
配列固有のクエリ演算子のリストについては、「配列」を参照してください。
ドキュメントの配列のクエリ
次の例では、bios コレクション内のawards
配列に対してクエリを実行します。
次の操作は、
awards
配列にフィールドaward
の値が"Turing Award"
に等しい要素を含む bios コレクション内のドキュメントを返します。db.bios.find( { "awards.award": "Turing Award" } ) 次の操作は、
awards
配列においてaward
フィールドが"Turing Award"
に等しく、かつyear
フィールドが 1980 より大きい要素が少なくとも 1 つ含まれる bios コレクション内のドキュメントを返します。db.bios.find( { awards: { $elemMatch: { award: "Turing Award", year: { $gt: 1980 } } } } ) 配列要素に複数の条件を指定するには、
$elemMatch
演算子を使用します。
配列のクエリについての詳細と例については、次を参照してください。
配列固有のクエリ演算子のリストについては、「配列」を参照してください。
BSON 正規表現のクエリ
BSON 正規表現を値として含むドキュメントを検索するには、 bsonRegExp
オプションをtrue
に設定してfind()
を呼び出します。 bsonRegExp
オプションを使用すると、JavaScript の正規表現として表現できない正規表現を返すことができます。
次の操作では、 testbson
という名前のコレクション内のドキュメントが返されます。 foo
という名前のフィールドの値はBSONRegExp
型です。
db.testbson.find( {}, {}, { bsonRegExp: true } )
[ { _id: ObjectId('65e8ba8a4b3c33a76e6cacca'), foo: BSONRegExp('(?-i)AA_', 'i') } ]
プロジェクション
プロジェクションパラメーターは、返されるフィールドを指定します。 このパラメーターに含まれるのは、包含指定と除外指定のいずれかであり、除外指定の対象が_id
フィールドでない限り、両方にはなりません。
注意
_id
フィールドがプロジェクション ドキュメント _id: 0
で明示的に除外されていない限り、_id
フィールドが返されます。
返却するフィールドの指定
次の操作は、bios コレクション内のすべてのドキュメントを検索し、 name
フィールド、 contribs
フィールド、および _id
フィールドのみを返します。
db.bios.find( { }, { name: 1, contribs: 1 } )
注意
_id
フィールドがプロジェクション ドキュメント _id: 0
で明示的に除外されていない限り、_id
フィールドが返されます。
明示的に除外されたフィールド
次の操作は、bios コレクションを検索し、 name
埋め込みドキュメント内の first
フィールド、および birth
フィールドを除くすべてのフィールドを返します。
db.bios.find( { contribs: 'OOP' }, { 'name.first': 0, birth: 0 } )
フィールドの明示的除外<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \"_id
role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">
注意
_id
フィールドがプロジェクション ドキュメント _id: 0
で明示的に除外されていない限り、_id
フィールドが返されます。
次の操作は、bios コレクション内のドキュメントを検索し、name
フィールドと contribs
フィールドのみを返します。
db.bios.find( { }, { name: 1, contribs: 1, _id: 0 } )
配列と埋め込みドキュメントについて
次の操作は、bios コレクション を検索し、name
埋め込みドキュメントの last
フィールドと contribs
配列の最初の 2 つの要素を返します。
db.bios.find( { }, { _id: 0, 'name.last': 1, contribs: { $slice: 2 } } )
ネストされたフォームを使用して埋め込みフィールドを指定することもできます。以下がその例です。
db.bios.find( { }, { _id: 0, name: { last: 1 }, contribs: { $slice: 2 } } )
集計式の使用
db.collection.find()
のプロジェクションでは集計式と構文を受け付けます。
集計式と構文を使用して、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。たとえば、次の操作では、集計式を使用して、name
フィールドと awards
フィールドの値を上書きし、さらに新しいフィールド reportDate
、 reportBy
、および reportNumber
を含めます。
db.bios.find( { }, { _id: 0, name: { $concat: [ { $ifNull: [ "$name.aka", "$name.first" ] }, " ", "$name.last" ] }, birth: 1, contribs: 1, awards: { $cond: { if: { $isArray: "$awards" }, then: { $size: "$awards" }, else: 0 } }, reportDate: { $dateToString: { date: new Date(), format: "%Y-%m-%d" } }, reportBy: "hellouser123", reportNumber: { $literal: 1 } } )
reportRun
フィールドに値 1
を設定します。この操作では、次のドキュメントが返されます。
{ "birth" : ISODate("1924-12-03T05:00:00Z"), "contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ], "name" : "John Backus", "awards" : 4, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1927-09-04T04:00:00Z"), "contribs" : [ "Lisp", "Artificial Intelligence", "ALGOL" ], "name" : "John McCarthy", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1906-12-09T05:00:00Z"), "contribs" : [ "UNIVAC", "compiler", "FLOW-MATIC", "COBOL" ], "name" : "Grace Hopper", "awards" : 4, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1926-08-27T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "name" : "Kristen Nygaard", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1931-10-12T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "name" : "Ole-Johan Dahl", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1956-01-31T05:00:00Z"), "contribs" : [ "Python" ], "name" : "Guido van Rossum", "awards" : 2, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1941-09-09T04:00:00Z"), "contribs" : [ "UNIX", "C" ], "name" : "Dennis Ritchie", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1965-04-14T04:00:00Z"), "contribs" : [ "Ruby" ], "name" : "Matz Matsumoto", "awards" : 1, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1955-05-19T04:00:00Z"), "contribs" : [ "Java" ], "name" : "James Gosling", "awards" : 2, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "contribs" : [ "Scala" ], "name" : "Martin Odersky", "awards" : 0, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
返されたカーソルを反復する
mongosh
で、返されたカーソルが var
キーワードを使用して変数に割り当てられていない場合、カーソルは自動的に反復され、クエリに一致する最初の 20 件のドキュメントにアクセスします。自動的に反復されるドキュメントの数は、displayBatchSize
変数を更新することで変更できます。
次の例では、バッチ サイズを 3 に設定します。設定後の db.collection.find()
操作では、カーソルの反復ごとに 3 つのドキュメントのみが返されます。
config.set( "displayBatchSize", 3 )
結果を手動で反復処理するには、次のセクションに示すように、返されたカーソルを var
キーワードを含む変数に割り当てます。
変数名付き
次の例では、変数 myCursor
を使用してカーソルを反復処理し、一致するドキュメントを出力します。
var myCursor = db.bios.find( ); myCursor
メソッドの使用<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">next()
次の例では、カーソル メソッド next()
を使用してドキュメントにアクセスします。
var myCursor = db.bios.find( ); var myDocument = myCursor.hasNext() ? myCursor.next() : null; if (myDocument) { var myName = myDocument.name; print (tojson(myName)); }
出力するには、 print(tojson())
の代わりに printjson()
メソッドを使用することもできます。
if (myDocument) { var myName = myDocument.name; printjson(myName); }
メソッドの使用<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">forEach()
次の例では、カーソルメソッド forEach()
を使用してカーソルを反復処理し、ドキュメントにアクセスします。
var myCursor = db.bios.find( ); myCursor.forEach(printjson);
カーソルの動作を変更する
mongosh
および ドライバーは、find()
メソッドによって返されたカーソルを呼び出してその動作を変更するいくつかのカーソル メソッドを提供します。
結果セット内のドキュメントの順序付け
sort()
メソッドは結果セット内のドキュメントを順序付けします。次の操作は、name
フィールドで昇順にソートされたbios コレクション内のドキュメントを返します。
db.bios.find().sort( { name: 1 } )
sort()
は、SQL のORDER BY
ステートメントに対応します。
返すドキュメントの数の制限
limit()
メソッドは、結果セット内のドキュメントの数を制限します。次の操作は、bios コレクション内の最大 5
個のドキュメントを返します。
db.bios.find().limit( 5 )
limit()
は、SQL のLIMIT
ステートメントに対応します。
結果セットの開始点の設定
skip()
メソッドは結果セットの開始点を制御します。次の操作は、bios コレクションの最初の 5
個のドキュメントをスキップし、残りのすべてのドキュメントを返します。
db.bios.find().skip( 5 )
照合の指定
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
collation()
メソッドによって db.collection.find()
操作の照合を指定します。
db.bios.find( { "name.last": "hopper" } ).collation( { locale: "en_US", strength: 1 } )
カーソル メソッドの組み合わせ
次のステートメントは、カーソル メソッド limit()
と sort()
を連結します。
db.bios.find().sort( { name: 1 } ).limit( 5 ) db.bios.find().limit( 5 ).sort( { name: 1 } )
2 つのステートメントは同等です。limit()
メソッドと sort()
メソッドを連結する順序は重要ではありません。どちらのステートメントも、「name」で昇順ソートした最初の 5 つのドキュメントを返します。
利用可能なmongosh
カーソル メソッド
オプションでの変数の使用let
クエリオプションを指定してクエリの動作を変更することで、結果が返される方法を指定できます。
たとえば、 find
メソッド内の他の場所からアクセスできる変数を定義するには、 let
オプションを使用します。変数を使用して結果をフィルターするには、$expr
演算子内で変数にアクセスする必要があります。
コレクション cakeFlavors
を以下ように作成します。
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
次の例では、let
で targetFlavor
変数を定義し、その変数を使用してチョコレート ケーキの風味を検索します。
db.cakeFlavors.find( { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, { _id: 0 }, { let : { targetFlavor: "chocolate" } } )
出力:
[ { flavor: 'chocolate' } ]
現在のユーザーに付与されたロールのドキュメントの取得
MongoDB 7.0 以降では、新しい USER_ROLES
システム変数を使用してユーザー ロールを返すことができます。
このセクションのシナリオでは、予算情報を含むコレクション内のドキュメントへのアクセスが制限されているさまざまなロールを持つユーザーを示します。
このシナリオでは、USER_ROLES
の使用法の 1 つを示しています。budget
コレクションには、 allowedRoles
という名前のフィールドを持つドキュメントが含まれています。次のシナリオで示すように、allowedRoles
フィールドにあるユーザー ロールと USER_ROLES
システム変数によって返されるロールを比較するクエリを作成できます。
注意
別の USER_ROLES
シナリオの例については、「現在のユーザーに付与されているロールの医療情報の取得」を参照してください。その例では、次の例とは異なり、ドキュメントフィールドにユーザーロールを保存しません。
このセクションの予算シナリオでは、次の手順を実行してロール、ユーザー、および budget
コレクションを作成します。
ユーザーの作成
必要なロールを持つ John
および Jane
という名前のユーザーを作成します。test
データベースを各自のデータベース名に置き換えてください。
db.createUser( { user: "John", pwd: "jn008", roles: [ { role: "Marketing", db: "test" }, { role: "Development", db: "test" }, { role: "Operations", db: "test" }, { role: "read", db: "test" } ] } ) db.createUser( { user: "Jane", pwd: "je009", roles: [ { role: "Sales", db: "test" }, { role: "Operations", db: "test" }, { role: "read", db: "test" } ] } )
コレクションの作成
実行:
db.budget.insertMany( [ { _id: 0, allowedRoles: [ "Marketing" ], comment: "For marketing team", yearlyBudget: 15000 }, { _id: 1, allowedRoles: [ "Sales" ], comment: "For sales team", yearlyBudget: 17000, salesEventsBudget: 1000 }, { _id: 2, allowedRoles: [ "Operations" ], comment: "For operations team", yearlyBudget: 19000, cloudBudget: 12000 }, { _id: 3, allowedRoles: [ "Development" ], comment: "For development team", yearlyBudget: 27000 } ] )
John
がアクセス可能なドキュメントを取得するには、次の手順を実行します。
ドキュメントの取得
システム変数を使用するには、変数名の先頭に $$
を追加します。システム変数 USER_ROLES
を $$USER_ROLES
として指定します。
実行:
db.budget.find( { $expr: { $not: { $eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ] } } } )
前の例では、budget
コレクションから、この例を実行するユーザーが持っているロールの少なくとも 1 つと一致するドキュメントが返されます。そのために、この例では $setIntersection
を使用して、 budget
ドキュメントの allowedRoles
フィールドと $$USER_ROLES
のユーザー ロールのセットの共通部分が空ではないドキュメントを返します。
ドキュメントを確認します。
John
Marketing
、 Operations
、そして Development
ロールを有するかを確認し、次のドキュメントを参照します。
[ { _id: 0, allowedRoles: [ 'Marketing' ], comment: 'For marketing team', yearlyBudget: 15000 }, { _id: 2, allowedRoles: [ 'Operations' ], comment: 'For operations team', yearlyBudget: 19000, cloudBudget: 12000 }, { _id: 3, allowedRoles: [ 'Development' ], comment: 'For development team', yearlyBudget: 27000 } ]
Jane
がアクセス可能なドキュメントを取得するには、次の手順を実行します。
ドキュメントを確認します。
Jane
は Sales
と Operations
のロールを持ち、次のドキュメントを参照します。
[ { _id: 1, allowedRoles: [ 'Sales' ], comment: 'For sales team', yearlyBudget: 17000, salesEventsBudget: 1000 }, { _id: 2, allowedRoles: [ 'Operations' ], comment: 'For operations team', yearlyBudget: 19000, cloudBudget: 12000 } ]
注意
シャーディングされたクラスターでは、ユーザーに代わって別のサーバーノードがシャード上でクエリを実行できます。これらのクエリでは、USER_ROLES
には引き続きユーザーのロールが使用されます。
オプションを使用してクエリを変更する
次の例は、find()
クエリで options
フィールドを使用する方法を示しています。次の insertMany()
を使用して users
コレクションを設定します。
db.users.insertMany( [ { username: "david", age: 27 }, { username: "amanda", age: 25 }, { username: "rajiv", age: 32 }, { username: "rajiv", age: 90 } ] )
limit を含むオプション
次のクエリは、limit
オプション パラメーターを使用して結果セット内のドキュメントの数を制限します。
db.users.find( { username : "rajiv"}, // query { age : 1 }, // projection { limit : 1 } // options )
allowDiskUse を含むオプション
次のクエリは、options
パラメーターを使用して allowDiskUse
を有効にします。
db.users.find( { username : "david" }, { age : 1 }, { allowDiskUse : true } )
explain を含むオプション
次のクエリでは、 options
パラメータを使用してexecutionStats
explain の出力が取得されます。
var cursor = db.users.find( { username: "amanda" }, { age : 1 }, { explain : "executionStats" } ) cursor.next()
クエリで複数のオプションを指定する
次のクエリでは、1 つのクエリで複数のoptions
を使用します。 このクエリでは、 limit
を2
に設定すると 2 つのドキュメントのみが返され、 showRecordId
がtrue
に設定されている場合は結果セット内のドキュメントの位置を返します。
db.users.find( {}, { username: 1, age: 1 }, { limit: 2, showRecordId: true } )