MongoDB とドライバー
定義
db.collection.findOne(query, projection, options)コレクションまたはビューで指定されたクエリ条件を満たす 1 つのドキュメントを返します。
返されるドキュメントは、クエリ条件に一致するドキュメントの数と、使用するクエリプランによって異なる場合があります。
一致するドキュメントの数クエリプラン結果0
Any
このメソッドが返すのは
null1
Any
メソッドは、指定されたクエリ条件を満たすドキュメントを返します。
2以上
コレクションスキャン
このメソッドは、自然な順序に従って最初のドキュメントを返します。上限付きコレクションにおける自然な順序は、挿入順序と同じです。
2以上
インデックス スキャン
このメソッドは、インデックスから検索された最初のドキュメントを返します。
重要
If the query plan changes to use a different index, the method may return a different document. If your use case requires that a particular record is chosen consistently, you must use the
optionsdocument to specify a sort. For details on usingfindOne()with anoptionsdocument, see the example.If you specify a
projectionparameter,findOne()returns a document that only contains theprojectionfields. The_idfield is always included unless you explicitly exclude it.注意
find()メソッドと似ていますが、findOne()はカーソルではなくドキュメントを返します。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- 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 のバージョン
構文
db.collection.findOne() の形式は次のとおりです。
db.collection.findOne( <query>, <projection>, <options> )
db.collection.findOne() は以下のパラメーターを取ります。
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | 任意。クエリ演算子を使用してクエリの選択条件を指定します。 |
| ドキュメント | Optional. Specifies the fields to return using projection operators. Omit this parameter to return all fields in the matching document. For details, see Projection. |
| ドキュメント | 任意。クエリの追加オプションを指定します。これらのオプションは、クエリの動作と結果が返される方法を変更します。利用可能なオプションを確認するには、FindOptionsを参照してください。 |
動作
クライアントの切断
findOne() を発行したクライアントが操作が完了する前に切断された場合、 MongoDB はkillOp を使用して findOne() を終了としてマークします。
プロジェクション
重要
言語の整合性
find() と findAndModify() プロジェクションを集計の $project ステージと一貫性を持たせるために、次の条件が課されます。
find()とfindAndModify()のプロジェクションは集計式と構文 を受け付けます。MongoDB は、プロジェクションに関して追加の制限を適用します。詳細については、「プロジェクションの制限」を参照してください。
projection パラメーターにより、一致するドキュメントで返されるフィールドが決定されます。projection パラメーターは以下の形式のドキュメントです。
{ field1: <value>, field2: <value> ... }
プロジェクション | 説明 |
|---|---|
| フィールドを包含することを指定します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を |
| フィールドの除外を指定します。 |
| |
| 配列プロジェクション 演算子( ビューには使用できません。 |
|
ビューには使用できません。 |
| プロジェクションを行ったフィールドの値を指定します。 集計式と構文の使用(リテラルと集計変数の使用を含む)では、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。
|
注意
You can specify projection in two ways for find() and findOne():
projectionパラメータの設定optionsパラメータをprojectionに設定する
両方のパラメーターを指定する場合は、projection パラメーターが優先されます。options.projection を使用するには、projection パラメータを null または undefined に設定します。
埋め込みフィールド仕様
埋め込みドキュメント内のフィールドの場合は、次のいずれかを使用してフィールドを指定できます。
ドット表記の場合は次のようになります。
"field.nestedfield": <value>ネストされた形式の例
{ field: { nestedfield: <value> } }
_id フィールドプロジェクション
_id フィールドは、プロジェクションで _id: 0 を明示的に指定して抑制しない限り、返されるドキュメントにデフォルトで含まれます。
包含または除外
projection には、 _id フィールドを除いて、包含指定と除外指定の両方を含めることはできません。
フィールドを明示的に含めるプロジェクションでは、
_idフィールドだけが明示的に除外できる唯一のフィールドです。フィールドを明示的に除外するプロジェクションでは、
_idフィールドが明示的に包含できる唯一のフィールドですが、デフォルトで_idフィールドが含まれます。
例
このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。
空のクエリが指定されている場合
次の操作は、sample_mflixデータベース内の moviesコレクションから 1 つのドキュメントを返します。
db.movies.findOne()
クエリが指定されている場合
次の操作と、moviesコレクションから最初に一致するドキュメントが返されます。titleフィールドが文字「T」で始まる、 または yearフィールドが 1950 より小さい。
db.movies.findOne( { $or: [ { title: /^T/ }, { year: { $lt: 1950 } } ] } )
プロジェクションの使用
projection は返すフィールドを指定するパラメーターです。このパラメーターに含まれるのは、包含指定と除外指定のいずれかであり、除外指定の対象が _id フィールドでない限り、両方を指定することはできません。
返却するフィールドの指定
次の操作を実行すると、moviesコレクション内のドキュメントが検索され、title、genres、imdb フィールドのみが返されます。
db.movies.findOne( { }, { title: 1, genres: 1, imdb: 1 } )
除外されたものを除くすべてのフィールドを返します
次の操作では、cast 配列に "Al Pacino" が含まれる moviesコレクション内のドキュメントが返されます。プロジェクションでは、_idフィールド、imdb埋め込みドキュメント内の votesフィールド、および fullplotフィールドを除くすべてのフィールドが返されます。
db.movies.findOne( { cast: 'Al Pacino' }, { _id: 0, 'imdb.votes': 0, fullplot: 0 } )
オプション付き
次の操作では、sort オプションを使用して、ソートされた movies コレクションから最初に一致するドキュメントを返します。この例では、コレクションは year の昇順でソートされています。
db.movies.findOne( { }, { }, { sort: { year: 1 } } )
findOne 結果ドキュメント
単一ドキュメントが返されるため、カーソル メソッドは findOne() の結果に適用できません。ドキュメントに直接アクセスできます。
var myDocument = db.movies.findOne(); if (myDocument) { var myTitle = myDocument.title; print(myTitle); }
let オプションでの変数の使用
クエリオプションを指定してクエリの動作を変更することで、結果が返される方法を指定できます。
たとえば、 findOne メソッド内の他の場所からアクセスできる変数を定義するには、 let オプションを使用します。変数を使用して結果をフィルターするには、$expr 演算子内で変数にアクセスする必要があります。
次の例では、 let で targetTitle 変数を定義し、その変数を使用して "The Godfather" というタイトルの映画を検索します。
db.movies.findOne( { $expr: { $eq: [ "$title", "$$targetTitle" ] } }, { _id: 0, title: 1, year: 1 }, { let : { targetTitle: "The Godfather" } } )