【问题标题】:MongoDB - Sub document search does not workMongoDB - 子文档搜索不起作用
【发布时间】:2013-01-22 08:03:25
【问题描述】:

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

> 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" : {

    }
}

【问题讨论】:

    标签: mongodb indexing mongodb-query


    【解决方案1】:

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

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

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

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

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

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

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

    ensureIndex({Specifications.body: 1})
    

    【讨论】:

    • 谢谢,但我无法创建索引Specifications.body,因为每个变体至少有 50 个规范。我应该进行哪些更改,以便查询具有规范列表的变体(例如 {Body: 'SUV', Capacity : 4} 将使用索引?
    • @JoyceBabu 您真的需要为所有这些字段使用索引还是只为最具选择性的字段使用索引?
    • 我将查询这些规范中的至少 10 个。我应该为它们创建一个复合索引吗?
    • @JoyceBabu 没有自己设计很难说。我会同意这一点,但请注意,该索引在这方面可能相当大。您可能会发现让某些字段命中文档会获得更好的性能
    • @JoyceBabu 是的,这应该意味着索引大小应该相对较小并且由于您将拥有的文档数量而易于存储
    【解决方案2】:

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

    【讨论】:

    • 谢谢,但我无法创建索引Specifications.body,因为每个变体至少有 50 个规范。我应该进行哪些更改,以便查询具有规范列表的变体(例如 {Body: 'SUV', Capacity : 4} 将使用索引?
    • 那么您需要对要查询的字段有一个复合索引。请注意,在复合索引中,查询的顺序很重要。 docs.mongodb.org/manual/core/indexes/#index-type-compound
    • 我可以进行任何架构修改以加快搜索速度吗?例如,将{Specifications : {Body: "SUV"}} 更改为{Specification : [ {Body: "SUV"} ]}
    • 这实际上可能对您有所帮助,因为对于数组元素,mongodb 将为每个元素创建索引记录。在这种情况下,对于 {Body: "SUV"} 和 {Body: "SVN"},索引中会有两条不同的记录,您将能够进行快速搜索。
    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多