db.collection.findOne()
MongoDB とドライバー
このページでは、 mongosh
メソッドについて説明します。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
定義
db.collection.findOne(query, projection, options)
コレクションまたは ビューで指定されたクエリ条件を満たす 1 つのドキュメントを返します。
返されるドキュメントは、クエリ条件に一致するドキュメントの数と、使用するクエリプランによって異なる場合があります。
一致するドキュメントの数クエリプラン結果0Anyこのメソッドが返すのはnull
1Anyメソッドは、指定されたクエリ条件を満たすドキュメントを返します。2以上コレクションスキャンこのメソッドは、自然な順序に従って最初のドキュメントを返します。上限付きコレクションにおける自然な順序は、挿入順序と同じです。2以上インデックス スキャンこのメソッドは、インデックスから検索された最初のドキュメントを返します。重要
クエリプランが別のインデックスを使用するように変更された場合、このメソッドは別のドキュメントを返すことがあります。ユースケースで特定のレコードを一貫して選択する必要がある場合は、
options
ドキュメントを使用してソートを指定する必要があります。options
ドキュメントでfindOne()
を使用する方法の詳細については、例を参照してください。projection
パラメーターを指定すると、findOne()
はprojection
フィールドのみを含むドキュメントを返します。_id
フィールドは明示的に除外されない限り、常に含まれます。
互換性
次の環境でホストされる配置には db.collection.findOne()
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
findOne()
メソッドの形式は次のとおりです。
db.collection.findOne( <query>, <projection>, <options> )
findOne()
メソッドは次のパラメーターを取ります。
Parameter | タイプ | 説明 |
---|---|---|
query | ドキュメント | 任意。クエリ演算子を使用してクエリの選択条件を指定します。 |
projection | ドキュメント | 任意。 プロジェクション演算子を使用して返すフィールドを指定します。 このパラメーターを省略すると、一致するドキュメント内のすべてのフィールドが返されます。 詳細については、「プロジェクション 」を参照してください。 |
options | ドキュメント | 任意。クエリの追加オプションを指定します。これらのによりクエリ動作と結果が返される方法が変更されます。利用可能なオプションを確認するには、「FindOptions」 を参照してください。 |
動作
クライアントの切断
MongoDB 4.2以降では、 db.collection.findOne()
を発行したクライアントが操作の完了前に切断した場合、MongoDB は killOp
を使用してdb.collection.findOne()
を終了対象としてマークし 。
プロジェクション
重要
言語の整合性
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> | プロジェクションを行ったフィールドの値を指定します。 集計式と構文の使用(リテラルと集計変数の使用を含む)では、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。
|
埋め込みフィールド仕様
埋め込みドキュメント内のフィールドの場合は、次のいずれかを使用してフィールドを指定できます。
ドット表記の場合は次のようになります。
"field.nestedfield": <value>
ネストされた形式の例
{ field: { nestedfield: <value> } }
_id
フィールドプロジェクション
_id
フィールドは、プロジェクションで _id: 0
を明示的に指定して抑制しない限り、返されるドキュメントにデフォルトで含まれます。
包含または除外
projection
には、 _id
フィールドを除いて、包含指定と除外指定の両方を含めることはできません。
フィールドを明示的に含めるプロジェクションでは、
_id
フィールドだけが明示的に除外できる唯一のフィールドです。フィールドを明示的に除外するプロジェクションでは、
_id
フィールドが明示的に包含できる唯一のフィールドですが、デフォルトで_id
フィールドが含まれます。
プロジェクションの詳細については、以下も参照してください。
例
空のクエリが指定されている場合
次の操作は、bios コレクションから単一ドキュメントを返します。
db.bios.findOne()
クエリが指定されている場合
次の操作は、埋め込まれたドキュメント name
内のフィールド first
が文字 G
で始まるか、または フィールド birth
が new
Date('01/01/1945')
未満である、bios コレクションから最初に一致するドキュメントを返します。
db.bios.findOne( { $or: [ { 'name.first' : /^G/ }, { birth: { $lt: new Date('01/01/1945') } } ] } )
プロジェクションの使用
projection
は返すフィールドを指定するパラメーターです。このパラメーターに含まれるのは、包含指定と除外指定のいずれかであり、除外指定の対象が _id
フィールドでない限り、両方を指定することはできません。
返却するフィールドの指定
次の操作を実行すると、bios コレクション内のドキュメントを検索し、name
、contribs
、_id
フィールドのみを返します。
db.bios.findOne( { }, { name: 1, contribs: 1 } )
除外されたものを除くすべてのフィールドを返します
次の操作は、contribs
フィールドに要素 OOP
が含まれる bios コレクション内のドキュメントを返し、_id
フィールド、埋め込みドキュメント name
内の first
フィールド、および birth
フィールドを除いてすべてのフィールドを返します。
db.bios.findOne( { contribs: 'OOP' }, { _id: 0, 'name.first': 0, birth: 0 } )
オプション付き
次の操作では、sort
オプションを使用して、ソートされた bios
コレクションから最初に一致するドキュメントを返します。この例では、コレクションは birth
の昇順でソートされています。
db.bios.findOne( { }, { }, { sort: { birth: 1 } } )
findOne
結果ドキュメント
単一ドキュメントが返されるため、カーソル メソッドは findOne()
の結果に適用できません。次のとおり、ドキュメントに直接アクセスできます。
var myDocument = db.bios.findOne(); if (myDocument) { var myName = myDocument.name; print (tojson(myName)); }
オプションでの変数の使用let
クエリオプションを指定してクエリの動作を変更することで、結果が返される方法を指定できます。
たとえば、 findOne
メソッド内の他の場所からアクセスできる変数を定義するには、 let
オプションを使用します。変数を使用して結果をフィルターするには、$expr
演算子内で変数にアクセスする必要があります。
コレクション cakeFlavors
を以下ように作成します。
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
次の例では、let
で targetFlavor
変数を定義し、その変数を使用してチョコレート ケーキの風味を検索します。
db.cakeFlavors.findOne( { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, { _id: 0 }, { let : { targetFlavor: "chocolate" } } )
出力:
{ flavor: 'chocolate' }
利用可能なすべてのクエリ オプションを確認するには、「FindOptions」を参照してください。