node.js - 具有 Mongoose 聚合和求和嵌套字段的 Node

标签 node.js mongodb mongoose aggregation-framework mongodb-aggregation

当我对我的收藏执行此查询时...

models.Project.find(function(err, result) {
    //result = doc below
}).populate('media')

...我得到这个结果:

{ 
  _id: 57f36baa6cf34d079c8474a0,
  code: 'ZMIA',
  __v: 0,
  media:[
    { 
      _id: 57f36bb26cf34d079c847766,
      project_code: 'ZMIA',
      amount: 228,
      __v: 0 
    },
    { 
      _id: 57f36bb26cf34d079c84775c,
      project_code: 'ZMIA',
      amount: 250,
      __v: 0 
    } 
  ]
},
{ 
  _id: 57f36baa6cf34d079c8474a1,
  code: 'ZMJU',
  __v: 0,
  media: [] 
}

media 是一个 ref 字段。如何将嵌套的媒体对象(如果存在)聚合到 $sumamount 字段并将结果按 project_code 分组?

最佳答案

您可以使用聚合框架,在其中运行由初始 $unwind 组成的聚合管道。 管道将非规范化 media 字段,因为它是一个数组,然后是 $lookup 运算符对具有 media 引用的集合进行左连接。进一步 $unwind需要 运算符来展平由于连接而产生的数组字段,然后执行 $group 扁平文档上的运算符管道以产生所需的结果。

运行以下管道应该适合您:

models.Project.aggregate([
    { "$unwind": "$media" },
    {
        "$lookup": {
            "from": "media", // <-- collection to join
            "localField": "media",
            "foreignField": "_id",
            "as": "media_joined"
        }
    },
    { "$unwind": "$media_joined" },
    {
        "$group": {
            "_id": "$media_joined.project_code",
            "total": { "$sum": "$media_joined.amount" }
        }
    }
], function(err, result){
    console.log(result);
})

关于node.js - 具有 Mongoose 聚合和求和嵌套字段的 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853936/

相关文章:

node.js - 在 32 位系统上编译 node.js

node.js - Node 调试 : why can't I set a breakpoint?

node.js - Parse Cloud code "first"查询数组返回不同的结果

performance - mongodb 的索引

javascript - NodeJS+Mongoose - 需要帮助使用 Promises 重构代码

node.js - 如何从 instagram node.js 获取其他用户媒体

javascript - 根据编码的formData值设置 Node 请求头

python - PyMongo 和 Flask-PyMongo 库之间的区别

node.js - Mongoose 没有带来任何结果

javascript - Mongoose:改进 find() 和 count() 查询