子文档键上的 MongoDB 索引

Posted

技术标签:

【中文标题】子文档键上的 MongoDB 索引【英文标题】:MongoDB index on subdocuments keys 【发布时间】:2018-10-27 02:00:11 【问题描述】:

是否可以在每个文档中不同的子文档键上创建一个 mongodb 索引?例如,如果我们有

 
    _id: 1, 
    languages: 
        en: ...,
        fr: ...,
        de: ...
    
,
 
    _id: 2, 
    languages: 
        cs: ...,
        fr: ...
    

... 在语言的键上创建和索引,所以稍后在 find() 中只是为了检查这种语言是否存在(类似于 "languages.fr": $exists: true)。

如果语言是数组,我想这应该类似于在数组字段上创建索引:

 _id: 1, languages: ['en', 'fr', 'de'],
 _id: 2, languages: ['cs', 'fr']


db.coll.createIndex(  languages: 1  )

【问题讨论】:

【参考方案1】:

是否可以在每个文档中不同的子文档键上创建 mongodb 索引?

不。相反,您需要使用允许您创建通用索引的faceted search data model。

例如:


 _id : 1, 
 languages: [
    "language": "en", "content" : ... ,
    "language": "fr", "content" : ... ,
    "language": "de", "content" : ... ,
   ...
 ]

查询可能如下所示:

db.coll.find( 
  "languages" :  
    "$elemMatch" :  
      "language" : "en", "content" : ... 
    
  
)

db.coll.find((  "languages.language" : "en"  )

(详细解释见上面的链接)

集合上的索引将是:

 "languages.language" : 1, "languages.content" : 1 

【讨论】:

“是的,如果你的数据模型可以支持的话。” - 如果不是 “不,你不能。改为这样做......” 因为这就是你在这里所说的。您不能索引“键”(正如问题提出和询问的那样),实际上您应该“使用数组”。因此,您展示了解决方案的正确结构,但通过说“是”发送了错误信息。我同意这种结构,但该消息只会引起混乱。

以上是关于子文档键上的 MongoDB 索引的主要内容,如果未能解决你的问题,请参考以下文章

基于查询语法未使用子文档的 MongoDB 索引

mongodb3.0的索引管理学习整理

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

我可以对索引子文档字段执行 MongoDB“开始于”查询吗?

玩转mongoDB:索引,速度的引领(普通索引篇)

嵌入文档上的 mongodb 索引