私はこのドキュメント構造を持っています:
{
"key": {
"a": Int32,
"b": String
}
}
に一意のインデックスがkey
あり、とにインデックス(一意ではない)がkey.a
ありkey.b
ます。
それでも、このクエリはスキャンします(遅い):
{"key.a": 456213154}
このクエリは次のことを行いません。
{"key": {
"a": 456213154,
"b": {"$exists": true}
}}
なぜそれが必要なのですか、そしてそれは必要ですか?
(これはv2.0.3であることに言及する必要があります)
編集:説明を追加:
> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BtreeCursor key.a_1",
"nscanned" : 10962,
"nscannedObjects" : 10962,
"n" : 10962,
"millis" : 20,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key.a" : [
[
456213154,
456213154
]
]
}
}
> db.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}}).explain()
{
"cursor" : "BtreeCursor key_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key" : [
[
{
"a" : 456213154,
"b" : {
"$exists" : true
}
},
{
"a" : 456213154,
"b" : {
"$exists" : true
}
}
]
]
}
}
編集:私は2つの一意でないインデックス(key.a_1
とkey.b_1
)を削除して、それがおそらくクエリを傷つけているかどうかを確認しようとしました。そうではありませんでした:
> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 23240518,
"nscannedObjects" : 23240518,
"n" : 10962,
"millis" : 15047,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}