子文档键上的 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 索引的主要内容,如果未能解决你的问题,请参考以下文章
获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)