2015-04-22 53 views
1
 db.test.find().pretty(); 
    { 
     "_id" : ObjectId("5537f2cfba0bf10870747d7e"), 
     "a" : 1, 
     "b" : [ 
      "abcd", 
      "xyz" 
     ] 
    } 


    db.test.getIndexes(); 
    [ 
     { 
      "v" : 1, 
      "key" : { 
       "_id" : 1 
      }, 
      "ns" : "test.test", 
      "name" : "_id_" 
     }, 
     { 
      "v" : 1, 
      "key" : { 
       "a" : 1, 
       "b" : 1 
      }, 
      "ns" : "test.test", 
      "name" : "a_1_b_1" 
     } 
    ] 

db.test.find({a: { $ne : 2}, b : { $in : ["abcd", "xyz"]}}).explain(); 
{ 
    **"cursor" : "BasicCursor", - doesn't hits index**. 
    "isMultiKey" : false, 
    "n" : 1, 
    "nscannedObjects" : 1, 
    "nscanned" : 1, 
    "nscannedObjectsAllPlans" : 3, 
    "nscannedAllPlans" : 3, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 

    }, 
    "server" : "vishals-Mac-mini.local:27017" 
} 

其他查询一个$,

db.test.find({a: 1, b : { $in : ["abcd", "xyza"]}}) 
db.test.find({a: { $ne : 2}, b : { $in : ["abcd", "xyza"]}}) 

使用索引时指数未使用。 碰到索引似乎取决于$ in数组中指定的值。如果它包含现有文档的所有值,则不使用索引。

Mongo version - 2.4.6

谢谢。

+0

您使用的是哪个版本的MongoDB? 2.6按预期为您发布的每个查询使用索引。 – wdberkeley

回答

0

docs,它指出:

$ne$nin运营商不具有选择性。 See Create Queries that Ensure Selectivity。如果您需要使用这些,通常最好是 以确保查询的一部分包含更多的选择性标准 。

+0

感谢您的回复。我知道$ ne并不是有选择性的,我会期望它做一个完整的索引扫描,但至少它应该有替换命中的索引,而不是求助于基本的游标。更何况,最令人困惑的是$ ne基于$ in子句中的值为某些查询创建索引。 – Vishal