C'était drôle, je ne peux pas décider de dire que c'est un bug ou non, c'est à vous de décider :
Il existe deux syntaxes disponibles :http://docs.mongodb.org/manual/ référence/opérateur/requête/
Lorsque vous utilisez :
db.collection.find( { age : 25 } )
également
db.collection.find( { age : 25 } ).explain()
db.collection.find( { age : 25 } ).hint(someindex)
fonctionne bien.
Lorsque vous utilisez votre solution (l'autre syntaxe) :
db.collection.find( { $query: { age : 25 } } )
la sortie de
db.sampleCollection.find({$query:{"stringField":"Random string0"}}).explain()
S'affichera comme si la requête n'utilisait pas l'index
si vous utilisez également .hint pour l'index, le résultat sera omis. :) (C'est que je ne comprends pas vraiment)
Heureusement, il existe également une autre syntaxe pour ces opérations :vous pouvez utiliser :
db.sampleCollection.find({$query:{"stringField":"Random string0"}, $explain:1})
il aura la bonne sortie et m'a montré l'utilisation de l'index. Il existe également une syntaxe similaire pour $hint.
Vous pouvez consulter la documentation ici :http://docs.mongodb.org /manual/reference/meta-query-operators/
J'ai trouvé cela vraiment intéressant alors j'ai activé le profileur :
J'ai créé une collection de test (queryTst) avec environ 250 000 documents chacun avec seulement _id et un champ d'âge dans la structure avec un index sur l'âge.
Pour cette requête :
db.queryTst.find({$query:{"age":16},$explain:1})
j'ai :
{
"cursor" : "BtreeCursor age_1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"nscannedObjectsAllPlans" : 2,
"nscannedAllPlans" : 2,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"age" : [
[
16,
16
]
]
},
"allPlans" : [
{
"cursor" : "BtreeCursor age_1",
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"indexBounds" : {
"age" : [
[
16,
16
]
]
}
}
],
"oldPlan" : {
"cursor" : "BtreeCursor age_1",
"indexBounds" : {
"age" : [
[
16,
16
]
]
}
},
"server" : ""
}
pour cela :
db.queryTst.find({$query:{"age":16},$explain:1}).explain()
j'ai :
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 250011,
"nscanned" : 250011,
"nscannedObjectsAllPlans" : 250011,
"nscannedAllPlans" : 250011,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 103,
"indexBounds" : {
},
dans le journal du profileur :pour la première
{
"ts" : ISODate("2013-01-30T20:35:40.526Z"),
"op" : "query",
"ns" : "test.queryTst",
"query" : {
"$query" : {
"age" : 16
},
"$explain" : 1
},
"ntoreturn" : 0,
"ntoskip" : 0,
"nscanned" : 2,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(368),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(8),
"w" : NumberLong(5)
}
},
"nreturned" : 1,
"responseLength" : 567,
"millis" : 0,
"client" : "127.0.0.1",
"user" : ""
}
pour la seconde :
{
"ts" : ISODate("2013-01-30T20:35:47.715Z"),
"op" : "query",
"ns" : "test.queryTst",
"query" : {
"query" : {
"$query" : {
"age" : 16
},
"$explain" : 1
},
"$explain" : true
},
"ntoreturn" : 0,
"ntoskip" : 0,
"nscanned" : 250011,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(104092),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(13),
"w" : NumberLong(5)
}
},
"nreturned" : 1,
"responseLength" : 373,
"millis" : 104,
"client" : "127.0.0.1",
"user" : ""
}
ce qui signifie en quelque sorte pour moi que c'est l'explication () qui provoque l'analyse de la table dans la syntaxe mixte.