penso che un indice di scarsa è la risposta a questo, anche se avrete bisogno di un indice per ogni campo. http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes
Gli indici sparsi dovrebbero aiutare con $ esiste: query true.
Anche se il tuo campo non è davvero scarso (il che significa che è quasi tutto impostato), non ti aiuterà molto.
Aggiornamento Credo di essermi sbagliato. Sembra che ci sia un problema aperto (https://jira.mongodb.org/browse/SERVER-4187) ancora che $ exists non usi indici sparsi. Tuttavia, si può fare qualcosa di simile con find e ordinare, che sembra che utilizza correttamente l'indice di scarsa:
db.ent.find({}).sort({a:1});
Ecco una dimostrazione completa della differenza, utilizzando i valori di esempio:
> 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});
Si noti che find({}).sort({a:1})
utilizza l'indice (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
}
]
]
}
}
E find({a:{$exists:true}})
fa una scansione completa:
> 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" : {
}
}
Sembra che sia possibile utilizzare anche .hint ({a: 1}) per forzare l'utilizzo dell'indice.
> 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
}
]
]
}
}
un'occhiata a: http://www.mongodb.org/display/DOCS/Using+Multikeys+to+Simulate+a+Large+Number+of+ Gli indici – Dewfy