あなたがやろうとしていることをもっと説明できますか?最初のスキーマ設計はあまり良くありません。非常に遅くなる可能性のある配列演算子を使用する以外に、実際に対処する方法がない配列がたくさんあります。
2 番目のアイデアは順調に進んでいるようですが、構文が少しずれています。サブ配列の代わりにドキュメントを挿入できれば、スキーマの扱いがはるかに簡単になり、以下に示すように各ドキュメントの 2 つの値にインデックスを付けることができます。
> db.test.insert({field: [{a:1, b:2}, {a:3, b:4}]})
> db.test.ensureIndex({"field.a":1})
> db.test.ensureIndex({"field.b":1})
> db.test.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.test",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"field.a" : 1
},
"ns" : "test.test",
"name" : "field.a_1"
},
{
"v" : 1,
"key" : {
"field.b" : 1
},
"ns" : "test.test",
"name" : "field.b_1"
}
]
> db.test.find({"field.a": 3})
{ "_id" : ObjectId("520e2ec749177daf439a2ff6"), "field" : [ { "a" : 1, "b" : 2 }, { "a" : 3, "b" : 4 } ] }
Explain を実行して、実際にインデックスが使用されていることを確認できます (カーソル行を参照)。
> db.test.find({"field.a": 3}).explain()
{
"cursor" : "BtreeCursor field.a_1",
"isMultiKey" : true,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"field.a" : [
[
3,
3
]
]
},
"server" : "xxxxx-PC:27017"
}