【问题标题】:Nested array aggregation query in mongodb with projected fileds?mongodb中带有投影字段的嵌套数组聚合查询?
【发布时间】:2017-06-23 19:44:58
【问题描述】:

我有以下数据。我想使用 mongodb 聚合函数从下面显示的数据中提取供应商和客户。我想投影特定字段并从输出数据中删除其余字段。

 {
        "_id" : ObjectId("577f9a25bea25d480d8f1895"),
        "password" : "12345",
        "mobile" : "9582223889",
        "email" : "a@b.com",
        "name" : "ashiush jindal",
        "invoice" : [{
            "name" : "Ashish Jindal",
            "dname" : "jindalbe",
            "email" : "a@b.com",
            "password" : "12345",
            "role" : ["customer"]
          }],
        "inventory" : [{ }, {
            "item" : "Levis Jeans",
            "sku" : "12345",
            "buy" : [{
                "bp" : "jindalbe",
                "qty" : 50,
                "created" : "9/7/2016"
              }]
          }, {
            "item" : "Levis Trouser",
            "sku" : "123",
            "selling_price" : 2000,
            "buy" : [{
                "bp" : "jindalbe",
                "qty" : 90,
                "created" : "9/7/2016",
                "price_per_qty" : 1000
              }, {
                "bp" : "jindalbe",
                "qty" : 60,
                "created" : "9/7/2016",
                "price_per_qty" : 1000
              }, {
                "bp" : "jindalbe",
                "qty" : 60,
                "created" : "9/7/2016",
                "price_per_qty" : 1000
              }, {
                "bp" : "jindalbe",
                "qty" : 60,
                "created" : "9/7/2016",
                "price_per_qty" : 1000
              }, {
                "bp" : "jindalbe",
                "qty" : 60,
                "created" : "9/7/2016",
                "price_per_qty" : 5000
              }, null]
          }],
        "business_partner" : [{
            "name" : "Ashish Jindal",
            "dname" : "jindalbe",
            "email" : "a@b.com",
            "password" : "12345",
            "role" : ["customer"]
          }, {
            "name" : "Ashish Jindal",
            "dname" : "jindalbe",
            "email" : "a@b.com",
            "password" : "12345",
            "role" : ["customer"]
          }, {
            "name" : "Ashish Kumar",
            "dname" : "jindal",
            "email" : "a@b.com",
            "password" : "12345",
            "role" : ["supplier"]
          }],
        "__v" : 0
      }

我想提取所有作为供应商的业务合作伙伴名称。

如下图所示。

{
   suppliers:["Ashish Kumar"]
}

我想使用聚合查询来做到这一点。

我尝试的解决方案是。

          [
                { $match: { "_id": ObjectId(req.headers["token"]) } },{
                    $project: {
                        suppliers: {
                            $filter: {
                                input: '$business_partner.role',
                                as: 'role',
                                cond: {"$eq":["$$bp.role","supplier"]}
                            }
                        },
                        _id: 0
                    }
                }
            ];

【问题讨论】:

    标签: javascript mongodb express mongoose aggregation-framework


    【解决方案1】:

    您可以$unwind 您的数组并使用$match 条件。 然后使用$addToSet 将您的所有供应商添加到一个数组中。每个_id 不会有供应商重复:

    db.device.aggregate([{
      "$unwind": "$business_partner"
    }, {
      "$unwind": "$business_partner.role"
    }, {
      "$match": {
        "_id": ObjectId("577f9a25bea25d480d8f1895"),
        "business_partner.role": "supplier"
      }
    }, {
      "$project": {
        "_id": 1,
        "business_partner": 1
      }
    },{
        "$group": {
            _id:"$_id",
            supplier: {
                $addToSet: '$business_partner'
            }
        }
    }]);
    

    这与 mongo 2.6 兼容(没有$filter

    它会给你这种输出:

    {
      "_id": ObjectId("577f9a25bea25d480d8f1895"),
      "supplier": [{
        "name": "Ashish Kumar",
        "dname": "jindal",
        "email": "a@b.com",
        "password": "12345",
        "role": "supplier"
      }]
    }
    

    【讨论】:

    • 它会返回一个类似供应商的数组:[]
    • 我已经更新了我的帖子,添加了一个$addToSet 以将给定_id 的每个供应商推送到一个名为supplier 的单个数组中,其中没有重复
    • 非常感谢@bertrand :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2016-02-14
    • 2019-09-29
    相关资源
    最近更新 更多