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" }