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