mongo中的子文档索引

sle*_*dav 37 indexing mongodb

ensureIndex(data)当典型数据看起来像我打电话时到底发生了什么data:{name: "A",age:"B", job : "C"}?它会在这三个字段上创建一个复合索引,还是只在请求数据的任何内容或完全不同的东西时才创建一个索引?

jim*_*ary 47

你可以这样做:

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Run Code Online (Sandbox Code Playgroud)

在子文档上的索引嵌入字段索引下的文档中讨论

子文档部分的重要部分是"当在子文档上执行相等匹配时,字段顺序事项和子文档必须完全匹配."

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

但是,正如子文档示例所示,如果您只是索引整个子文档而不是特定字段然后执行比较运算符(如$gte),则可以得到一些有趣的结果(您可能不会期望) - 如果您索引一个特定的子字段,你得到一个不太灵活,但可能更有用的索引.

这完全取决于你的用例.

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

> 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"
}
Run Code Online (Sandbox Code Playgroud)

]

从输出中可以看出,它创建了一个名为的新键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
Run Code Online (Sandbox Code Playgroud)

主要的是你可以看到你的新索引被使用了(光标字段中的BtreeCursor data.name_1_data.age_1_data.job_1就是这样的情况).如果你看到"cursor" : "BasicCursor",那么你的索引没有被使用.

有关详细信息,请查看此处.