2013-04-08 87 views

回答

1

空数组在MongoDB中的处理方式与null不同。正如您在Mongo shell的以下代码中看到的那样,稀疏索引将空数组查找为空数组,而不是null

 
> c = db.docs 
test.docs 
> c.insert({a : []}) 
> c.ensureIndex({a : 1}, {sparse: true}) 
> c.find({a : []}).count() 
1 
> c.find({a : null}).count() 
0 

与最有趣的关于MongoDB的问题一样,使用explain将提供丰富的信息。例如,您可以看到测试实际使用索引,并且索引的边界是null[],表明它们的独特处理。

 
> c.find({a : null}).explain() 
{ 
    "cursor" : "BtreeCursor a_1", 
    "isMultiKey" : false, 
    "n" : 0, 
    "nscannedObjects" : 0, 
    "nscanned" : 0, 
    "nscannedObjectsAllPlans" : 0, 
    "nscannedAllPlans" : 0, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
     "a" : [ 
      [ 
       null, 
       null 
      ] 
     ] 
    }, 
    "server" : "new-host.home:27017" 
} 
> c.find({a : []}).explain() 
{ 
    "cursor" : "BtreeCursor a_1 multi", 
    "isMultiKey" : false, 
    "n" : 1, 
    "nscannedObjects" : 1, 
    "nscanned" : 1, 
    "nscannedObjectsAllPlans" : 1, 
    "nscannedAllPlans" : 1, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
     "a" : [ 
      [ 
       null, 
       null 
      ], 
      [ 
       [ ], 
       [ ] 
      ] 
     ] 
    }, 
    "server" : "new-host.home:27017" 
}