Я думаю, что разреженный индекс является ответом на это, хотя вам понадобится индекс для каждого поля.http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes
Разреженные индексы должны помочь с $ Существуют: истинные запросы.
Даже если ваше поле не очень разреженное (то есть оно в основном установлено), оно не поможет вам в этом.много.
Обновление Наверное, я не прав.Похоже, что есть открытая проблема (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" : {
}
}
Похоже, вы также можете использовать.подсказка ({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
}
]
]
}
}