MongoDB中空数组的多键稀疏索引

时间:2013-04-08 02:55:52

标签: mongodb

在这种情况下会出现什么样的行为? mongo会将空数组视为null / undefined并将其包含在稀疏索引中,或者如果数组为空,则文档不会被编入索引吗?

1 个答案:

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