0

我有一个将variantsspecifications作为子文档调用的集合。使用点符号搜索变体对我有用(但不使用索引),而使用子文档格式返回零结果(但使用索引)。我做错了什么?

> db.variants.getIndexes();
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "automobile.variants",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
            "specifications" : 1
        },
        "ns" : "automobile.variants",
        "name" : "specifications_1"
    }
]
> db.variants.find({"specifications" : { "Body" : "SUV" }}).explain()
{
    "cursor" : "BtreeCursor specifications_1",
    "nscanned" : 0,
    "nscannedObjects" : 0,
    "n" : 0,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "specifications" : [
            [
                {
                    "Body" : "SUV"
                },
                {
                    "Body" : "SUV"
                }
            ]
        ]
    }
}
> db.variants.find({"specifications.Body" : "SUV" }).explain()
{
    "cursor" : "BasicCursor",
    "nscanned" : 787,
    "nscannedObjects" : 787,
    "n" : 176,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {

    }
}
4

2 回答 2

2

您已将索引放在子文档本身上。

当你这样做时,MongoDB 索引数组的元素,如果你有:

{
    Specifications: [
        {Body: 'SUV'}
    ]
}

如果您查询,MongoDB 可以使用索引:

db.col.find({Specifications: {Body: 'SUV'}})

由于它与元素匹配,但它无法通过该子文档的部分进行查询。

如果您希望使用索引查询子文档的各个部分,您应该索引这些部分,即:

ensureIndex({Specifications.body: 1})
于 2013-01-22T08:16:17.077 回答
1

在这种情况下,您应该在要进行查询的确切字段上有一个索引specifications.Body。在您的第一个查询中,因为您在规范字段上有一个索引,所以查询使用该索引,但根据您的架构它是无效的。

于 2013-01-22T08:15:48.357 回答