我有一个如下文档结构:
{
"_id": ...,
"name": "Document name",
"properties": {
"prop1": "something",
"2ndprop": "other_prop",
"other3": ["tag1", "tag2"],
}
}
我无法知道properties
子文档中的实际字段名称(它们由应用程序用户提供),因此我无法创建索引,如properties.prop1
。我也不知道字段值的结构,它们可以是单值,嵌入式文档或数组。
是否有任何实用的方法可以使用这种架构设计对集合执行高效查询?
我想到的一个选项是在文档中添加一个新字段,将其编入索引并将每个文档的已使用字段名称设置到此字段中。
{
"_id": ...,
"name": "Document name",
"properties": {
"prop1": "something",
"2ndprop": "other_prop",
"other3": ["tag1", "tag2"],
},
"property_fields": ["prop1", "2ndprop", "other3"]
}
现在我可以先对property_fields
字段运行查询,之后让MongoDB扫描找到的文档,看看properties.prop1
是否包含所需的值。这肯定比较慢,但可行。
答案 0 :(得分:2)
处理此问题的一种方法是使用如下的模式。
{
"name" : "Document name",
"properties" : [
{
"k" : "prop1",
"v" : "something"
},
{
"k" : "2ndprop",
"v" : "other_prop"
},
{
"k" : "other3",
"v" : "tag1"
},
{
"k" : "other3",
"v" : "tag2"
}
]
}
然后你可以索引“properties.k”和“properties.v”,例如:
db.foo.ensureIndex({"properties.k": 1, "properties.v": 1})