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

db.collection.find()

項目一覧

  • 定義
  • 互換性
  • 構文
  • 動作
  • 詳細

MongoDB とドライバー

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

C#Java SyncNode.jsPyMongoCC++GoJava RSKotlin CoroutineKotlin SyncPHPMongoidRustScala
db.collection.find(query, projection, options)

コレクションまたはビュー内のドキュメントを選択し、選択したドキュメントに カーソルを返します。

次の値を返します。query 条件に一致するドキュメントへのカーソルfind()メソッドで「ドキュメントを返す」際、このメソッドで実際に返すのはドキュメントへのカーソルです。

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

  • 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 ステージと一貫性を持たせるために、

projection パラメーターにより、一致するドキュメントで返されるフィールドが決定されます。projection パラメーターは以下の形式のドキュメントです。

{ <field1>: <value>, <field2>: <value> ... }
プロジェクション
説明
<field>: <1 or true>
フィールドを包含することを指定します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を true として処理します。
<field>: <0 or false>
フィールドの除外を指定します。
"<field>.$": <1 or true>

$ 配列プロジェクション 演算子を使用して、配列フィールドのクエリ条件に一致する最初の要素を返します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を true として処理します。

ビューには使用できません。

<field>: <array projection>

配列プロジェクション 演算子($elemMatch$slice)を使用して、含める配列要素を指定します。

ビューには使用できません。

<field>: <$meta expression>

$meta 演算子式を使用して、使用可能な per-document metadataを含めることを指定します。

ビューには使用できません。

<field>: <aggregation expression>

プロジェクションを行ったフィールドの値を指定します。

集計式と構文の使用(リテラルと集計変数の使用を含む)では、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。

  • プロジェクションの値として数値でもブール値でもないリテラル(例えば、文字列リテラルや配列、演算子式)を指定すると、フィールドは新しい値でプロジェクションされます。次に例を示します。

    • { field: [ 1, 2, 3, "$someExistingField" ] }

    • { field: "New String Value" }

    • { field: { status: "Active", total: { $sum: "$existingArray" } } }

  • フィールドにリテラル値をプロジェクションするには、$literal 集計式を使用します。次に例を示します。

    • { field: { $literal: 5 } }

    • { field: { $literal: true } }

    • { field: { $literal: { fieldWithValue0: 0, fieldWithValue1: 1 } } }

オプション
説明
allowDiskUse
実行に 100 メガバイト以上のメモリを必要とするパイプラインが、ディスク上の一時ファイルに書き込むかどうか。詳細については、 cursor.allowDiskUse() を参照してください。
allowPartialResults
シャーディングされたコレクションに対するクエリで、クエリされたシャードが 1 つ以上使用できない場合に、コマンド(または後続の getMore コマンド)がエラーではなく部分的な結果を返します。
awaitData
カーソルが tailable-await カーソルの場合。tailabletrue である必要があります。
collation
更新操作の照合設定。
comment
プロファイラー ログに表示されるクエリに $comment を追加します。
explain
指定した冗長モードに基づいて explain の出力を追加します。
hint
クエリオプティマイザがクエリ内で特定のインデックスを使用するように強制します。
limit
結果セットで返されるドキュメントの制限を設定します。
最大
特定のインデックスの排他的上限。
maxAwaitTimeMS
新しいドキュメントが追尾可能 (tailable) カーソルクエリを満たすまでにサーバーが待機する最大時間。tailableawaitDatatrue である必要があります。
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: 0 を明示的に指定して抑制しない限り、返されるドキュメントにデフォルトで含まれます。

projection には、 _id フィールドを除いて、包含指定と除外指定の両方を含めることはできません。

  • フィールドを明示的に含めるプロジェクションでは、_id フィールドだけが明示的に除外できる唯一のフィールドです。

  • フィールドを明示的に除外するプロジェクションでは、_id フィールドが明示的に包含できる唯一のフィールドですが、デフォルトで _id フィールドが含まれます。

プロジェクションの例 」を参照してください。

db.collection.find()mongosh で実行すると、カーソルが自動的に反復され、最初の 20 件のドキュメントが表示されます。「 it 」と入力して反復を続行します。

ドライバーを使用して返されたドキュメントにアクセスするには、ドライバー言語に適したカーソル処理メカニズムを使用します。

Tip

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

読み取り保証(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 を参照してください。

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

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

クエリ設定を削除するには、 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 コレクション内の_id5 に等しいドキュメントを返します。

    db.bios.find( { _id: 5 } )
  • 次の操作は、埋め込みドキュメント name 内のフィールド last"Hopper" に等しい bios コレクション内のドキュメントを返します。

    db.bios.find( { "name.last": "Hopper" } )

    注意

    埋め込みドキュメントのフィールドにアクセスするには、ドット表記"<embedded document>.<field>")を使用します。

選択基準のセットに一致するドキュメントを検索するには、<criteria> パラメーターを指定して find() を呼び出します。

MongoDB は、条件を指定するためのさまざまなクエリ演算子を提供します。

  • 次の操作では、 $in 演算子を使用して、 _id5 または ObjectId("507c35dd8fada716c89d0013") に等しい bios コレクション内のドキュメントを返します。

    db.bios.find(
    { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }
    )
  • 次の操作では、$gt 演算子を使用して、 birthnew 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 コレクションから、birthnew 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 thannew Date('1950-01-01') であり、death フィールドが存在しないすべてのドキュメントを返します。

db.bios.find( {
birth: { $gt: new Date('1920-01-01') },
death: { $exists: false }
} )

クエリ演算子のリストについては、「クエリ セレクター」を参照してください。

$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 正規表現を値として含むドキュメントを検索するには、 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 }
)

注意

_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 フィールドの値を上書きし、さらに新しいフィールド reportDatereportBy、および 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 }

find()メソッドは結果にカーソルを返します。

mongosh で、返されたカーソルが var キーワードを使用して変数に割り当てられていない場合、カーソルは自動的に反復され、クエリに一致する最初の 20 件のドキュメントにアクセスします。自動的に反復されるドキュメントの数は、displayBatchSize 変数を更新することで変更できます。

次の例では、バッチ サイズを 3 に設定します。設定後の db.collection.find() 操作では、カーソルの反復ごとに 3 つのドキュメントのみが返されます。

config.set( "displayBatchSize", 3 )

結果を手動で反復処理するには、次のセクションに示すように、返されたカーソルを var キーワードを含む変数に割り当てます。

次の例では、変数 myCursor を使用してカーソルを反復処理し、一致するドキュメントを出力します。

var myCursor = db.bios.find( );
myCursor

次の例では、カーソル メソッド 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);
}

次の例では、カーソルメソッド 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 つのドキュメントを返します。

クエリオプションを指定してクエリの動作を変更することで、結果が返される方法を指定できます。

たとえば、 find メソッド内の他の場所からアクセスできる変数を定義するには、 let オプションを使用します。変数を使用して結果をフィルターするには、$expr 演算子内で変数にアクセスする必要があります。

コレクション cakeFlavors を以下ように作成します。

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

次の例では、lettargetFlavor 変数を定義し、その変数を使用してチョコレート ケーキの風味を検索します。

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 コレクションを作成します。

1

実行:

db.createRole( { role: "Marketing", roles: [], privileges: [] } )
db.createRole( { role: "Sales", roles: [], privileges: [] } )
db.createRole( { role: "Development", roles: [], privileges: [] } )
db.createRole( { role: "Operations", roles: [], privileges: [] } )
2

必要なロールを持つ 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" }
]
} )
3

実行:

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 がアクセス可能なドキュメントを取得するには、次の手順を実行します。

1

実行:

db.auth( "John", "jn008" )
2

システム変数を使用するには、変数名の先頭に $$ を追加します。システム変数 USER_ROLES$$USER_ROLES として指定します。

実行:

db.budget.find( {
$expr: {
$not: {
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
}
}
} )

前の例では、budget コレクションから、この例を実行するユーザーが持っているロールの少なくとも 1 つと一致するドキュメントが返されます。そのために、この例では $setIntersection を使用して、 budget ドキュメントの allowedRoles フィールドと $$USER_ROLES のユーザー ロールのセットの共通部分が空ではないドキュメントを返します。

3

John MarketingOperations、そして 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 がアクセス可能なドキュメントを取得するには、次の手順を実行します。

1

実行:

db.auth( "Jane", "je009" )
2

実行:

db.budget.find( {
$expr: {
$not: {
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
}
}
} )
3

JaneSalesOperations のロールを持ち、次のドキュメントを参照します。

[
{
_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 オプション パラメーターを使用して結果セット内のドキュメントの数を制限します。

db.users.find(
{ username : "rajiv"}, // query
{ age : 1 }, // projection
{ limit : 1 } // options
)

次のクエリは、options パラメーターを使用して allowDiskUse を有効にします。

db.users.find(
{ username : "david" },
{ age : 1 },
{ allowDiskUse : true }
)

次のクエリでは、 optionsパラメータを使用してexecutionStats explain の出力が取得されます。

var cursor = db.users.find(
{ username: "amanda" },
{ age : 1 },
{ explain : "executionStats" }
)
cursor.next()

次のクエリでは、1 つのクエリで複数のoptionsを使用します。 このクエリでは、 limit2に設定すると 2 つのドキュメントのみが返され、 showRecordIdtrueに設定されている場合は結果セット内のドキュメントの位置を返します。

db.users.find(
{},
{ username: 1, age: 1 },
{
limit: 2,
showRecordId: true
}
)

戻る

db.collection.explain