如何在MongoDB中创建嵌套索引?

Mr.*_*ael 36 indexing mongodb

A.如何索引"嵌套"及其所有值?

B.我如何为valuetwo编制索引?

{
    id: 00000,
    attrs: {
        nested:{
            value: value1,
            valuetwo: value2,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我看过这里:http://www.mongodb.org/display/DOCS/Indexes,据我所知的文档,还不清楚索引非嵌套的东西.

Bry*_*isi 60

您创建它们就像在顶级字段上创建索引一样:

db.collection.ensureIndex({"attrs.nested.value": 1})
Run Code Online (Sandbox Code Playgroud)

您需要在每个字段上显式创建索引.

  • 对于未来的旅行者:ensureIndex()已被弃用,并在版本3中被createIndex()取代.https://docs.mongodb.com/manual/reference/method/db.collection.ensureIndex/ (10认同)

cia*_*mce 9

A.要索引"嵌套"中的所有属性,您必须单独索引它们:

db.collection.createIndex({"attrs.nested.value": 1});
db.collection.createIndex({"attrs.nested.valuetwo": 1});
Run Code Online (Sandbox Code Playgroud)

这可以在一个命令中完成:

db.collection.createIndexes([{"attrs.nested.value": 1}, {"attrs.nested.valuetwo": 1}]);
Run Code Online (Sandbox Code Playgroud)

B.仅为"valuetwo"编制索引:

db.collection.createIndex({"attrs.nested.valuetwo": 1})
Run Code Online (Sandbox Code Playgroud)

使用createIndex而不是ensureIndex,因为从3.0.0版开始,ensureIndex已不推荐使用

  • 您在A中给出的两组索引创建命令*不等同于*.第一个在`value`和`valuetwo`上创建单独的索引.第二个在这两个值上创建单个复合索引.此索引只能用于为"value"指定值的查询.也就是说,仅对`valuetwo`的查询没有用. (12认同)

Aru*_*ngh 7

如果任何索引字段是数组,MongoDB 会自动创建一个多键索引;您不需要显式指定多键类型。

这将适用于两个场景

db.coll.createIndex( { "addr.pin": 1 } )
Run Code Online (Sandbox Code Playgroud)

场景 1 嵌套对象

{
  userid: "1234",
  addr: {
    pin:"455522"
  }
},
{
  userid: "1234",
  addr: {
    pin:"777777"
  }
}
Run Code Online (Sandbox Code Playgroud)

场景 2 嵌套数组

{
  userid: "1234",
  addr: [
    { pin:"455522" },
    { pin:"777777" },
  ]
}
Run Code Online (Sandbox Code Playgroud)

https://docs.mongodb.com/manual/core/index-multikey/