【问题标题】:Node with mongoose aggregate and sum nested fields具有猫鼬聚合和求和嵌套字段的节点
【发布时间】:2017-02-12 17:11:21
【问题描述】:

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

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 是一个参考字段。如何将嵌套媒体对象(如果存在)聚合到 $sum amount 字段并按 project_code 分组结果?

【问题讨论】:

  • 目前还不清楚预期的结果是什么。能详细点吗?

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


【解决方案1】:

您可以使用聚合框架运行聚合管道,该管道由初始 $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);
})

【讨论】:

  • 谢谢!如果我能投票 100 次,我会的。很好的解释,代码第一次尝试。
  • 我关注 mongo 问题,我看到你在这个话题上回答了很多。你在那里工作吗? :)
  • @nurgasemetey 否 :) 刚刚对这项技术产生了浓厚的兴趣,并且在问题和技术帮助方面成为其他人的热心支持者。
猜你喜欢
  • 2020-06-12
  • 2021-04-14
  • 2019-09-06
  • 2020-01-27
  • 2015-05-19
  • 2021-08-05
  • 2013-10-07
  • 1970-01-01
  • 2015-05-14
相关资源
最近更新 更多