javascript - mongodb 中带有投影字段的嵌套数组聚合查询?

标签 javascript mongodb express mongoose aggregation-framework

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

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

我想提取所有同时也是 vendor 的业务合作伙伴的姓名。

在下面的表格中显示。

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

最佳答案

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

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

关于javascript - mongodb 中带有投影字段的嵌套数组聚合查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38510224/

相关文章:

node.js - 通过express js 和 bodyParser 实现安全文件上传

javascript - 在 Node.js 上使用 Faye 进行服务器身份验证

mongodb - 蒙戈导出语法错误: missing ; before statement @(shell):1:14

python - 使用 flask_pymongo 时身份验证失败

javascript - express 4.0 后端 API 上的 Angularjs 路由

node.js - Express + Passport + Session。为每个页面加载执行查询

javascript - AngularJS 的 404 图片加载问题

javascript - 如何在创建我的元素之前使用 "on click"

javascript - 将动态输入索引到其他动态输入数组

linux - MongoDB 启动时出现错误 : mongod dead but subsys locked