在没有已知字段名称的MongoDB子文档查询时,我可以使用索引吗?

时间:2013-11-26 13:10:01

标签: mongodb indexing schema-design

我有一个如下文档结构:

{
    "_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是否包含所需的值。这肯定比较慢,但可行。

1 个答案:

答案 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})