使用$ in和$ nin查询不使用索引

时间:2014-10-14 02:23:56

标签: mongodb

将属性与$ in和$ nin匹配时,Mongo不会正确使用索引。

如果仅使用$ in,那么index利用了:

db.assets.find({
  tags: {
    $in: ['blah']
  }
}).explain()

{
  "cursor" : "BtreeCursor tags_1",
  "isMultiKey" : true,
  "n" : 6,
  "nscannedObjects" : 6,
  "nscanned" : 6,
  "nscannedObjectsAllPlans" : 6,
  "nscannedAllPlans" : 6,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "millis" : 0,
  "indexBounds" : {
    "tags" : [
      [ "blah", "blah" ]
    ]
  }
}

但是,如果涉及$ nin,则不会查找与$ in匹配的文档,而是过滤掉那些未通过$ nin条件的文档,而是扫描所有文档。

db.assets.find({
  tags: {
    $in: ['blah'],
    $nin: ['cat']
  }
}).explain()

{
  "cursor" : "BtreeCursor tags_1",
  "isMultiKey" : true,
  "n" : 75760,
  "nscannedObjects" : 79974,
  "nscanned" : 1197016,
  "nscannedObjectsAllPlans" : 79974,
  "nscannedAllPlans" : 1197130,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 9351,
  "nChunkSkips" : 0,
  "millis" : 2331,
  "indexBounds" : {
    "tags" : [
      [ {"$minElement" : 1}, "cat" ],
      [ "cat", {"$maxElement" : 1} ]
    ]
  }
}

有没有办法诱骗Mongo做正确的事情?

0 个答案:

没有答案