各フィールドにインデックスが必要ですが、スパースインデックスがこれに対する答えだと思います。http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes
スパース インデックスは $exists:true クエリに役立ちます。
それでも、フィールドが本当にまばらでない場合 (ほとんどが設定されていることを意味します)、それほど役に立ちません。
更新私は間違っていると思います。$exists がスパース インデックスを使用しないという未解決の問題 ( https://jira.mongodb.org/browse/SERVER-4187 ) がまだあるようです。ただし、スパース インデックスを適切に使用しているように見える、find と sort を使用して次のようなことを行うことができます。
db.ent.find({}).sort({a:1});
例の値を使用して、違いの完全なデモを次に示します。
> db.ent.insert({'a':5775, 'b':'b1'})
> db.ent.insert({'c':'its a c', 'b':'b2'})
> db.ent.insert({'a':7557, 'c':'its a c'})
> db.ent.ensureIndex({a:1},{sparse:true});
find({}).sort({a:1})
インデックス (BtreeCursor)を使用することに注意してください。
> db.ent.find({}).sort({a:1}).explain();
{
"cursor" : "BtreeCursor a_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"a" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
そしてfind({a:{$exists:true}})
、フルスキャンを実行します:
> db.ent.find({a:{$exists:true}}).explain();
{
"cursor" : "BasicCursor",
"nscanned" : 3,
"nscannedObjects" : 3,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
.hint({a:1}) を使用して、インデックスを強制的に使用することもできるようです。
> db.ent.find().hint({a:1}).explain();
{
"cursor" : "BtreeCursor a_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"a" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}