L'ordre de $lt et $gt dans MongoDB requête de plage

Aujourd'hui, j'ai remarqué que l'ordre dans lequel les $lt et $gt opérateurs sont données semblent à la matière dans MongoDB 2.0.2.

J'ai une base de données de jeux. "le joueur" est un tableau de chaînes représentant les deux joueurs, "endedAtMS" est un horodatage quand le jeu est terminé. J'ai créé cet indice:

db.games.ensureIndex({player:1,endedAtMS:-1})

30 de mes jeux qui ont fini dans un certain intervalle de temps, commandé par le temps, les jeux où fini, je n':

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
            ]
        ]
    }
}

Tout semble bien fonctionner. Cependant quand j'ai changer l'ordre de $lt et $gt dans la requête ci-dessus, j'obtiens ceci:

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
            ]
        ]
    }
}

Comme vous pouvez le voir 126 docs doivent être numérisés pour obtenir les 30 docs pour le résultat. Si vous jetez un oeil à la indexBounds dans l'expliquer sortie, il semble que seul le premier opérateur est utilisé pour limiter l'espace de recherche dans l'index.

Que dois-je manquer? Pourquoi est-Mongo seulement en utilisant un opérateur de limiter l'espace de recherche?

  • Bonne trouvaille! Nous allons attendre la 10gen les gars 🙂
  • J'ai rencontré le même problème (bug?) avec la version 2.0.3. Voir ma question. 10gen - nous vous aimons - nous expliquer cette!
  • Je me demande combien de temps le 10gen les gars peuvent comprendre cela ... ont le sentiment que ce serait appeler pour 2.0.4
  • quels sont les résultats lorsque vous introduisez un $et dans la requête db.jeux.find({ "joueur" : "Stefan" , "endedAtMS" : { $et [ {"$gt" : 1301284969946}, {"$lt" : 1321284969946}]}}). sort({endedAtMS:-1}). limite(30). expliquer()
  • À l'aide de $et est le même. db.jeux.find({ "joueur" : "Stefan" , $et : [{"endedAtMS" : {"$gt" : 1301284969946}}, {"endedAtMS" : {"$lt" : 1321284969946}}]}).sort({endedAtMS:-1}).limite(30).expliquer (en) analyse 126 objets, l'échange de $lt et $gt analyses de 30 objets.
InformationsquelleAutor StefanMK | 2012-03-27