MongoDB在对象数组中的数组中查找属性的值匹配

时间:2016-04-29 10:43:20

标签: mongodb mongodb-query nosql

我的文档结构如下:

{
    "field1": "value",
    "field2": "value",
    "items": [
        {
            "inField1": "value1",
            "inField2": "value2",
            "votes": {
                "count": 2,
                "people": [
                    {
                        "username": "user1",
                        "image": "http://image/to/user1/profile.jpg"
                    },
                    {
                        "username": "user2",
                        "image": "http://image/to/user2/profile.jpg"
                    }
                ]
            }
        },
        {
            "inField1": "value3",
            "inField2": "value4",
            "votes": {
                "count": 1,
                "people": [
                    {
                        "username": "user1",
                        "image": "http://image/to/user1/profile.jpg"
                    }
                ]
            }
        }
    ]
}

现在我需要所有(单个物品对象字段),投票属性的任何属性中的用户名为 用户1

在上面提到的示例中,它应该同时返回,因为它们都在username属性中包含 user1 ,但是如果我搜索 user2 然后返回第一个项目。

2 个答案:

答案 0 :(得分:2)

在另一个SO链接中找到了这个问题的答案: https://stackoverflow.com/a/20155210/2641194

首先,我们必须 $ unwind 数组,然后每个的数据是一个单独的文档,然后我们的 $ match 进入图片只挑选那些满足查询的人:

[3:4,3:4]

如果您需要进一步了解 $ unwind ,以及它是如何运作的,请参阅此mongodb文档链接:https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/

答案 1 :(得分:1)

使用聚合框架,首先展开项目数组并匹配它们。

试试这个:

db.getCollection('test').aggregate(
    [{
        "$unwind": "$items"
    }, {
        "$match": {
            "items.votes.people.username": "user2"
        }
    }]
)