我在MongoDB中有以下类型的数据(与我的实际情况相比有所简化):
{
"name":"some name",
"attrs":[
{"n":"subject","v":"Some subject"},
{"n":"description","v":"Some great description"},
{"n":"comments","v":"Comments are here!"},
]
}
attrs数组是动态属性的容器,即我事先不知道将哪种类型的属性放在那里。n代表名称,v代表价值。
《 MongoDB In Action》一书将其描述为在属性完全可上调的情况下具有动态属性的解决方案。它还描述了您可以像这样对它建立索引:
db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})
然后可以这样查询:
db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})
当我对此进行测试时,我会得到非常差的性能。我用mycollection测试了200万个文档,但没有索引似乎表现更好。
那么,问题来了,有没有一种方法可以对这种动态属性设置建立索引,从而使索引具有良好的性能?就我而言,仅具有“主题”和“描述”之类的键并对其全部建立索引是不可行的...