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

Posted

技术标签:

【中文标题】如何在 MongoDB 中创建嵌套索引?【英文标题】:How to Create a nested index in MongoDB? 【发布时间】:2012-04-01 13:48:21 【问题描述】:

A.如何索引nested 及其所有值?

B.如何索引valuetwo


    id: 00000,
    attrs: 
        nested:
            value: value1,
            valuetwo: value2,
        
    

我看过这里:http://www.mongodb.org/display/DOCS/Indexes,据我所知,文档并不清楚索引未嵌套的内容。

【问题讨论】:

【参考方案1】:

您可以像在***字段上创建索引一样创建它们:

db.collection.createIndex("attrs.nested.value": 1)

您确实需要在每个字段上显式创建索引。

【讨论】:

对于未来的旅行者:ensureIndex() 已被弃用并在版本 3 中被 createIndex() 取代。docs.mongodb.com/manual/reference/method/… @Bryan - 请您在这里指导:***.com/questions/61948943/…【参考方案2】:

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

db.collection.createIndex("attrs.nested.value": 1);
db.collection.createIndex("attrs.nested.valuetwo": 1);

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

db.collection.createIndexes(["attrs.nested.value": 1, "attrs.nested.valuetwo": 1]);

B. 仅索引“valuetwo”:

db.collection.createIndex("attrs.nested.valuetwo": 1)

在 ensureIndex 上使用 createIndex,因为 ensureIndex 是 Deprecated since version 3.0.0

【讨论】:

您在 A 中给出的两组索引创建命令是等效的。第一个在valuevaluetwo 上创建单独的索引。第二个在这两个值上创建一个复合索引。此索引只能用于为 value 指定值的查询。也就是说,仅对 valuetwo 的查询没有用处。 有一个createIndexes() 命令(复数)可以在一个命令中创建多个索引。 (正如@MichaelMior 指出的那样,您的代码创建了一个复合索引,而不是两个单独的索引。)我还没有尝试过,但看起来你会这样做-db.collection.createIndexes(["attrs.nested.value": 1, "attrs.nested.valuetwo": 1]); @Kip 感谢您指出createIndexes。我编辑了答案以使用它。【参考方案3】:

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

这对两个场景都有效

db.coll.createIndex(  "addr.pin": 1  )

场景 1 嵌套对象


  userid: "1234",
  addr: 
    pin:"455522"
  
,

  userid: "1234",
  addr: 
    pin:"777777"
  


场景 2 嵌套数组


  userid: "1234",
  addr: [
     pin:"455522" ,
     pin:"777777" ,
  ]

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

【讨论】:

以上是关于如何在 MongoDB 中创建嵌套索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 .NET 在 MongoDB 中创建索引

如何使用 C++ 在 MongoDB 中创建地理空间索引

如何在 Robo 3T(原 Robomongo)中创建 Mongodb 索引?

如何使用 golang 和 mgo 库在 mongodb 中创建文本索引?

使用嵌套字段在MongoDB / Mongoose中创建多对多关系?

如何在spring数据mongodb中聚合一个嵌套对象并避免PropertyReferenceException?