子文档键上的MongoDB索引

子文档键上的MongoDB索引,mongodb,indexing,subdocument,Mongodb,Indexing,Subdocument,是否可以在每个文档中可能不同的子文档键上创建mongodb索引?例如,如果我们有 { _id: 1, languages: { en: {...}, fr: {...}, de: {...} } }, { _id: 2, languages: { cs: {...}, fr: {...} } } 。。。要在find()中创建语言键并对其编制索引,只需检查该语言

是否可以在每个文档中可能不同的子文档键上创建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 } )
是否可以在每个文档中可能不同的子文档键上创建mongodb索引

没有。相反,您需要使用允许您创建通用索引的

例如:

{
 _id : 1, 
 languages: [
   { "language": "en", "content" : ... },
   { "language": "fr", "content" : ... },
   { "language": "de", "content" : ... },
   ...
 ]
}
然后,查询可能类似于以下内容:

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

(有关详细说明,请参见上面的链接)

集合上的索引将是:

{ "languages.language" : 1, "languages.content" : 1 }
“是的,如果您的数据模型能够支持它。”-这不应该是“不,您不能。改为这样做…”,因为这就是您在这里实际要说的。您不能为“键”编制索引(如问题所示),实际上您应该“使用数组”。因此,您提出了正确的解决方案结构,但说“是”却发出了错误的信息。我同意这个结构,但这个信息只是造成混乱。
{ "languages.language" : 1, "languages.content" : 1 }