最初のアプローチでは、idがキーとして使用されるため、idフィールドにインデックスを付けることはできません。そのようなものは、キー値辞書のように機能します。このアプローチは、既知のIDのセット(もちろん数が少ない)がある場合に役立ちます。最初の例では、IDが前面でよく知られていると仮定します。
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
したがって、idフィールドidk73716の値を見つけるには、次の方法でこれを行うことができます
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
空の{}はクエリを示し、2番目の部分{'lines.idk73716':1}はクエリセレクタです。
特定のフィールドだけを選択できるという利点を持つキーとしてIDを持っています。 {'lines.idk73716':1}はフィールドセレクターですが、ここではクエリおよびセレクターとして機能します。しかし、これは2番目のアプローチでは実行できません。 2番目のコレクションがこのようなものであると仮定します
> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>
また、フィールドIDにインデックスを付けたので、IDでクエリを実行する場合
> db.second_collection.find({'lines.id' : 'idk73716' })
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>
上記の出力を見ると、一致するサブ(埋め込み)ドキュメントだけを選択する方法はないことがわかりますが、最初のアプローチでは可能です。これはmongodbのデフォルトの動作です。
を参照してください
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
idk73716だけでなく、すべての行をフェッチします
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
これがお役に立てば幸いです
編集
@GatesVP に感謝します 指摘してくれて
$ examplesを使用してIDをクエリすることはできますが、インデックスに登録することはできません