在这种情况下会出现什么样的行为? mongo会将空数组视为null / undefined并将其包含在稀疏索引中,或者如果数组为空,则文档不会被编入索引吗?
答案 0 :(得分: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" }