2
在这种情况下,预期会发生什么行为? mongo会将空数组视为空/未定义并将其包含到稀疏索引中,或者如果数组为空,文档将不会被索引?MongoDB中的空数组上的多密钥稀疏索引
在这种情况下,预期会发生什么行为? mongo会将空数组视为空/未定义并将其包含到稀疏索引中,或者如果数组为空,文档将不会被索引?MongoDB中的空数组上的多密钥稀疏索引
空数组在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" }