【问题标题】:Subdocument index in mongomongo中的子文档索引
【发布时间】:2013-05-22 02:31:43
【问题描述】:

当典型数据看起来像 data:{name: "A",age:"B", job : "C"} 时,当我调用 ensureIndex(data) 时究竟会发生什么?它会在这三个字段上创建一个复合索引,还是只创建一个适用于请求数据中的任何内容或完全不同的索引?

【问题讨论】:

  • 很容易检查。只需创建一个测试集合并使用.explain() 触发几个查询。这就是我会做的。我自己不确定 mongo 会做什么。

标签: mongodb indexing


【解决方案1】:

你可以做任何一个:

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})

这在indexes-on-embedded-fieldsindexes on sub documents 下的文档中进行了讨论

子文档部分的重要部分是'在对子文档执行相等匹配时,字段顺序很重要,子文档必须完全匹配。'

这意味着简单查询的 2 个索引是相同的。

但是,正如子文档示例所示,如果您只是索引整个子文档而不是特定字段,然后执行比较运算符(例如 @ 987654325@) - 如果你索引一个特定的子字段,你会得到一个不太灵活但可能更有用的索引。

这完全取决于您的用例。

无论如何,一旦您创建了索引,您就可以检查创建的内容:

> db.collection.getIndexes()
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "test.collection",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "data.name" : 1,
        "data.age" : 1,
        "data.job" : 1
    },
    "ns" : "test.collection",
    "name" : "data.name_1_data.age_1_data.job_1"
}

]

从输出中可以看出,它创建了一个名为 data.name_1_data.age_1_data.job_1 的新键(始终创建 _id_ 索引)。

如果你想测试你的新索引,那么你可以这样做:

> db.collection.insert({data:{name: "A",age:"B", job : "C"}})
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}})
> db.collection.find({"data.name" : "A"}).explain()
{
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1",
     .... more stuff

主要是您可以看到您的新索引已被使用(BtreeCursor data.name_1_data.age_1_data.job_1 在游标字段中表明是这种情况)。如果你看到"cursor" : "BasicCursor",那么你的索引没有被使用。

更多详细信息请查看here

【讨论】:

    【解决方案2】:

    你可以试试这个:

    db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
    

    【讨论】:

    • 这并没有回答问题,即这样做的结果是什么。
    • 这没有帮助。这类问题的重点是为有类似问题的人节省时间。
    猜你喜欢
    • 2014-10-24
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多