【问题标题】:MongoDB find value match for a property in array within array of objects [duplicate]MongoDB在对象数组中的数组中查找属性的值匹配[重复]
【发布时间】:2017-07-01 17:23:49
【问题描述】:

我的文档结构如下:

{
    "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"
                    }
                ]
            }
        }
    ]
}

现在我需要所有 item(项目字段的单个对象),其中 votes 属性的任何 people 属性的用户名都为 user1?

在上述示例中,它应该返回两个 items,因为它们都包含 user1 在用户名属性中,但如果我搜索user2 那么只有第一个项目应该被返回。

【问题讨论】:

    标签: mongodb mongodb-query nosql


    【解决方案1】:

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

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

    db.collection('topic').aggregate(
        [{
            "$unwind": "$items"
        }, {
            "$unwind": "$items.votes.people"
        }, {
            "$match": {
                "items.votes.people.username": "user2"
            }
        }], function(err, docs) {
            if(!err) {
                docs.forEach(function(doc) {
                    // code
                });
    
            } else {
                console.log(err);
            }
            db.close();
        });
    

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

    【讨论】:

      【解决方案2】:

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

      试试这个:

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

      【讨论】:

      • 不!不工作...还有其他建议吗?
      猜你喜欢
      • 2020-06-20
      • 1970-01-01
      • 2015-01-20
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多