我在 MongoDB 中有以下类型的数据(从我的真实案例中简化了一点):
{
"name":"some name",
"attrs":[
{"n":"subject","v":"Some subject"},
{"n":"description","v":"Some great description"},
{"n":"comments","v":"Comments are here!"},
]
}
Run Code Online (Sandbox Code Playgroud)
attrs 数组是动态属性的容器,即我事先不知道放置了什么样的属性。n 代表名称,v 代表价值。
MongoDB In Action 一书将其描述为在属性完全可预测的情况下具有动态属性的解决方案。它还描述了您可以像这样对其进行索引:
db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})
Run Code Online (Sandbox Code Playgroud)
然后可以像这样完成查询:
db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})
Run Code Online (Sandbox Code Playgroud)
当我测试这个时,我的性能很差。我用 mycollection 测试了 200 万个文档并且没有索引似乎表现更好。
那么,问题来了,有没有办法索引这种动态属性设置,以便索引提供良好的性能?就我而言,仅拥有“主题”和“描述”之类的键并将它们全部编入索引是不可行的......