子文档键上的MongoDB索引

时间:2018-05-16 22:11:30

标签: mongodb indexing subdocument

是否可以在子文档键上创建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 个答案:

答案 0 :(得分: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 }