2013-03-15 105 views
0

我想查询的MongoDB获得类似:MongoDB的范围外查询

“随着年龄的人不在范围[30,40]”

我做:

db.persons.find({'age' : {$nin : [{$lt : 30},{$gt : 40}]}}) 

这不适合我。我知道我可以做类似与< 30岁人,人随着年龄> 40,但我想知道如果我可以用“不是”运营商... 感谢

回答

1

$ in/$ nin是用于查询列表中的离散值并且不能用于范围搜索的运算符。

在你的榜样,用$ n在查询必须是

db.persons.find({age:{$nin:[30,31,32,33,34,35,36,37,38,39,40]}}) 

这一点也不实用,此外,也不会使用索引的:

db.persons.ensureIndex({age:1}) 
db.persons.find({age:{$nin:[30,31,32,33,34,35,36,37,38,39,40]}}).explain() 
    { 
     "cursor" : "BasicCursor", 
     "isMultiKey" : false, 
     "n" : 1, 
     "nscannedObjects" : 1, 
     "nscanned" : 1, 
     "nscannedObjectsAllPlans" : 1, 
     "nscannedAllPlans" : 1, 
     "scanAndOrder" : false, 
     "indexOnly" : false, 
     "nYields" : 0, 
     "nChunkSkips" : 0, 
     "millis" : 0, 
     "indexBounds" : { 

     }, 
     "server" : "Aspire-5750:27017" 
    } 

Sgoettschkes '上面的答案是正确的,将使用索引:

db.persons.find({$or: [{'age': {$lt: 30}},{'age': {$gt : 40}}]}).explain() 
{ 
    "clauses" : [ 
     { 
      "cursor" : "BtreeCursor age_1", 
      "isMultiKey" : false, 
      "n" : 0, 
      "nscannedObjects" : 0, 
      "nscanned" : 0, 
      "nscannedObjectsAllPlans" : 0, 
      "nscannedAllPlans" : 0, 
      "scanAndOrder" : false, 
      "indexOnly" : false, 
      "nYields" : 0, 
      "nChunkSkips" : 0, 
      "millis" : 12, 
      "indexBounds" : { 
       "age" : [ 
        [ 
         -1.7976931348623157e+308, 
         30 
        ] 
       ] 
      } 
     }, 
     { 
      "cursor" : "BtreeCursor age_1", 
      "isMultiKey" : false, 
      "n" : 1, 
      "nscannedObjects" : 1, 
      "nscanned" : 1, 
      "nscannedObjectsAllPlans" : 1, 
      "nscannedAllPlans" : 1, 
      "scanAndOrder" : false, 
      "indexOnly" : false, 
      "nYields" : 0, 
      "nChunkSkips" : 0, 
      "millis" : 0, 
      "indexBounds" : { 
       "age" : [ 
        [ 
         40, 
         1.7976931348623157e+308 
        ] 
       ] 
      } 
     } 
    ], 
    "n" : 1, 
    "nscannedObjects" : 1, 
    "nscanned" : 1, 
    "nscannedObjectsAllPlans" : 1, 
    "nscannedAllPlans" : 1, 
    "millis" : 12, 
    "server" : "Aspire-5750:27017" 
} 

有关queryin的更多信息g有效,参见http://docs.mongodb.org/manual/core/read-operations/