Oggi ho notato che l'ordine in cui vengono dati gli operatori $ lt e $ gt sembra importare in MongoDB 2.0.2.
Ho un database di giochi. "player" è un array di due stringhe che rappresentano entrambi i giocatori, "endedAtMS" è un timestamp al termine del gioco. Ho creato questo indice:
db.games.ensureIndex({player:1,endedAtMS:-1})
Per ottenere 30 dei miei giochi, terminate in un certo intervallo di tempo, in ordine di tempo i giochi in cui finito, mi fanno:
db.games.find({ "player" : "Stefan" ,
"endedAtMS" : { "$lt" : 1321284969946 ,
"$gt" : 1301284969946}}).
sort({endedAtMS:-1}).
limit(30).
explain()
{
"cursor" : "BtreeCursor player_1_endedAtMS_-1",
"nscanned" : 30,
"nscannedObjects" : 30,
"n" : 30,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"player" : [
[
"Stefan",
"Stefan"
]
],
"endedAtMS" : [
[
1321284969946,
-1.7976931348623157e+308
]
]
}
}
Tutto sembra funziona bene Tuttavia quando cambio l'ordine di $ lt e $ gt nella query precedente ottengo questo:
db.games.find({ "player" : "Stefan" ,
"endedAtMS" : { "$gt":1301284969946,
"$lt" : 1321284969946}}).
sort({endedAtMS:-1}).
limit(30).
explain()
{
"cursor" : "BtreeCursor player_1_endedAtMS_-1",
"nscanned" : 126,
"nscannedObjects" : 126,
"n" : 30,
"millis" : 1,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"player" : [
[
"Stefan",
"Stefan"
]
],
"endedAtMS" : [
[
1.7976931348623157e+308,
1301284969946
]
]
}
}
Come si può vedere 126 documenti necessitino di scansione per ottenere i 30 documenti per il risultato. Se dai un'occhiata all'indiceBounds nell'output di spiegazione sembra che solo il primo operatore sia utilizzato per limitare lo spazio di ricerca nell'indice.
Cosa mi manca? Perché Mongo utilizza solo un operatore per limitare lo spazio di ricerca?
Buona scoperta! Aspettiamo 10gen ragazzi :) –
Ho incontrato lo stesso problema (bug?) Con 2.0.3. Vedi [la mia domanda] (http://stackoverflow.com/questions/9776383/why-are-any-objects-being-scanned-here). 10gen - ti amiamo - ti preghiamo di spiegarlo! –
Mi chiedo quanto presto i 10gen ragazzi riescono a capirlo ... hanno la sensazione che ciò richiederebbe il 2.0.4 – Baba