MongoDBでは、db.collection.findOne()
メソッドは、コレクションまたはビューで指定されたクエリ条件を満たす1つのドキュメントを返します。
collection
一部は、検索するコレクションまたはビューの名前です。
findOne()
find()
に似ています 、ただしfindOne()
ディスク上のドキュメントの順序を反映する自然な順序に従って、フィルター基準に一致する最初のドキュメントのみを返します。
find()
一方、メソッドは、一致するすべてのドキュメントを返します。
また、findOne()
実際のドキュメントを返しますが、find()
各ドキュメントにカーソルを返すだけです。したがって、カーソルメソッドをfindOne()
に適用することはできません。 find()
でできるように 。
例
pets
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
findOne()
を使用できます 1つのドキュメントを返します。
db.pets.findOne()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
ここでは、pets
内のすべてのドキュメントを検索しました コレクション。フィルタリング基準を提供しなかったため、これですべてのドキュメントが検索されたことがわかります。議論すらしませんでした。
引数なしで呼び出された場合、findOne()
コレクションからすべてのドキュメントを検索し、一致するドキュメントのすべてのフィールドを返します。
上記を行う別の方法は次のようになります:
db.pets.findOne({})
この場合、空のドキュメントを渡します。
この空のドキュメントに追加することで、結果のフィルタリングを開始できます。
クエリを提供する
findOne()
の実際の構文 このようになります:
db.collection.findOne(query, projection)
これは、最初の引数としてクエリを渡し、2番目の引数として射影を渡すことができることを意味します。
クエリを渡すと、クエリに一致するドキュメントのみに検索範囲をフィルタリングするために使用されます。クエリは、クエリ演算子を含むドキュメントです。前の例で見たように、空のドキュメントはすべてのドキュメントを返します。
結果をコレクション内のドキュメントのサブセットに絞り込みましょう。
db.pets.findOne({"type":"Cat"})
結果:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
これにより、検索がtype
を持つドキュメントのみに絞り込まれました。 Cat
の値を持つフィールド 、次にfindOne()
その結果から最初のドキュメントを返しました。
この場合、フィルタリング基準としてドキュメントを渡すだけです。
クエリ演算子を使用することもできます。これらにより、クエリにより具体的な基準を適用できます。
例:
db.pets.findOne({"weight": { $lt: 10 }})
結果:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
埋め込みドキュメント
埋め込みドキュメントを含むドキュメントがある場合は、次の方法を使用して、埋め込みドキュメントのデータをクエリできます。
- ドット表記(例:
field.nestedfield: <value>
) - ネストされたフォーム(例:{
field: { nestedfield: <value> } }
)。このオプションはMongoDB4.4からのみ利用可能であることに注意してください。
次のドキュメントを挿入するとします。
db.pets.insertOne({ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } })
ドット表記を使用して、埋め込まれたドキュメント内でクエリを実行できます。
db.pets.findOne({ "specs.height": 400 })
結果:
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
次のクエリは同じドキュメントを返しますが、今回はネストされたフォームを使用して埋め込みドキュメントを参照します。
db.pets.findOne({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
結果:
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
ネストされたフォームを使用する場合、クエリは埋め込みドキュメント全体と正確に一致する必要があります。たとえば、次のクエリは一致しません:
db.pets.findOne({
"specs" : {
"height" : 400
}
})
結果:
null
配列
配列要素をそのインデックスまたは値で参照することにより、配列内のデータを参照できます。
次のドキュメントを挿入するとします。
db.pets.insertOne({ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] })
トップドッグ賞を受賞したすべての犬を検索したい場合は、次のクエリを作成できます(上記の犬が返されます)。
db.pets.findOne({
"awards": "Top Dog"
})
結果:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }>
次のように要素インデックスを指定することもできます:
db.pets.findOne({
"awards.0": "Top Dog"
})
そのためには、指定された値が指定されたインデックスにある必要があります。したがって、次のクエリは同じ犬を返しません。
db.pets.findOne({
"awards.1": "Top Dog"
})
配列はゼロベースであるため、インデックス0は最初の要素を指定し、1は2番目の要素を指定します。
プロジェクション
デフォルトでは、findOne()
を使用すると、すべてのドキュメントフィールドが返されます。 。ただし、必要に応じて、プロジェクションを使用して返されるフィールドの数を減らすことができます。
findOne()
の構文を思い出してください。 このようになります:
db.collection.findOne(query, projection)
query
フィルタリング基準(上記の例で行った)とprojection
を提供します 一致するドキュメントから返すフィールドを指定するオプションのプロジェクションです。したがって、プロジェクションを使用する場合は、クエリの後に配置するだけです。
プロジェクションを使用する場合、含めるフィールドを指定できます 、除外するフィールド 、 または両方。これを行うには、フィールドの名前と1
のいずれかをリストします (含める)または0
(除外するため)
投影法を使用して含めるフィールドを指定する例を次に示します。
db.pets.findOne({}, { name: 1, type: 1 })
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
_id
に注意してください 予測に含めなかった場合でも、フィールドが返されます。このフィールドは例外であり、デフォルトで含まれています。
_id
が必要ない場合 返されるフィールドは、明示的に除外する必要があります。
db.pets.findOne({}, { _id: 0, name: 1, type: 1 })
結果:
{ "name" : "Wag", "type" : "Dog" }
別の例を次に示します。今回は、除外するフィールドのみを指定します。
db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 })
結果:
{ "name" : "Wag", "type" : "Dog" }
その他の予測
投影でできることは他にもいろいろあります。たとえば、MongDB 4.4以降では、集計式を使用して、投影されたフィールドの値を指定できます。
例:
db.pets.findOne({}, {
"_id": 0,
"n": "$name",
"t": "$type",
"w": "$weight"
})
結果:
{ "n" : "Wag", "t" : "Dog", "w" : 20 }
ここでは、フィールド名の名前を変更しました。これを行うには、$fieldName
を使用して、各フィールドの新しい名前を文字列リテラルとして指定します。 そのフィールド値を出力する構文。結果は、SQLでエイリアスを使用するのと少し似ています。
詳細情報
詳細については、MongoDBのドキュメントを参照してください。