如何查询mongodb中动态的哈希子对象?

时间:2013-10-08 16:51:34

标签: mongodb

我目前有一个Question对象,我不知道如何查询它?

{ "title" : "Do you eat fast food?"
"answers" : [
        {
            "_id" : "506b422ff42c95000e00000d",
            "title" : "Yes",
            "trait_score_modifiers" : {
                "hungry" : 1
            }
        },
        {
            "_id" : "506b422ff42c95000e00000e",
            "title" : "No",
            "trait_score_modifiers" : {
                "not-hungry" : -1
            }
        }]
}

我试图找到查询trait_score_modifieres的问题(有时它存在,有时不存在)

我有以下但它不是动态的:

db.questions.find({"answers.trait_score_modifiers.not-hungry":{$exists: true}})

我怎么能这样做?

db.questions.find({"answers.trait_score_modifiers.{}.size":{$gt: 0}})

2 个答案:

答案 0 :(得分:1)

您应该修改架构,以便查询一致的键名。我使用聚合框架遇到了类似的问题,请参阅问题:Total values from all keys in subdocument

这样的事情应该有效(未经测试):

{
"title" : "Do you eat fast food?"
"answers" : [
        {
            "title" : "Yes",
            "trait_score_modifiers" : [
                {"dimension": "hungry", "value": 1}
            ]
        },
        {
            "title" : "No",
            "trait_score_modifiers" : [
                {"dimension": "not-hungry", "value": -1}
            ]
        }]
}

您可以使用以下内容返回所有具有动态维度的问题(例如“我的新维度”)

db.questions.find("answers.trait_score_modifiers.dimension": "my new dimension")

或将返回的内容限制为在该维度上具有特定值的问题(例如> 0):

db.questions.find(
    "answers.trait_score_modifiers": {
        "$elemMatch": {
            "dimension": "my new dimension",
            "value": {"$gt": 0}
            }
        }

    )

查询嵌套数组可能有点棘手,请务必阅读documentation在这种情况下,需要$elemMatch,否则您将返回包含trait_score_modifier {的文档{1}}但匹配的my new dimension位于不同数组元素的value键中。

答案 1 :(得分:0)

您的查询中需要$ elemMatch条件。

请参阅:http://docs.mongodb.org/manual/reference/projection/elemMatch/

如果您需要查询,请告诉我。