首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这种聚合可以在没有$function或$accumulator的Mongo上完成吗?(某种地图缩减)

这种聚合可以在没有$function或$accumulator的Mongo上完成吗?(某种地图缩减)
EN

Stack Overflow用户
提问于 2020-10-06 12:13:27
回答 1查看 30关注 0票数 0

我正在尝试将一个mapReduce操作转换成一个聚合管道,但是在这一步中我被阻塞了。我知道我可以使用标题中提到的运算符编写一个自定义函数,但理想情况下,我希望不用自定义聚合器来解决它。

由此:

代码语言:javascript
复制
{
field1: 'A',
field2: 'B',
field3: 'C',
statuses:[
   {
       key:"RECEIVED"
       value:20
   },{
      key:"NOT_DELIVERED"
      value:54
   },{
      key:"RECEIVED"
      value:30
   },{
      key:"RECEIVED"
      value:20
   },{
      key:"DELIVERED"
      value:58
   },{
      key:"DELIVERED"
      value:2
   }]}

我想要这个:(对于每个键,它们的值之和)

代码语言:javascript
复制
{
field1: 'A',
field2: 'B',
field3: 'C',
statuses:[
   {
      key:"NOT_DELIVERED"
      value:54
   },{
      key:"RECEIVED"
      value:70
   },{
      key:"DELIVERED"
      value:60
   }]}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 12:36:14

你可以用这个:

代码语言:javascript
复制
db.collection.aggregate([
   {
      $set: {
         statuses: {
            $map: {
               input: { $setUnion: "$statuses.key" },
               as: "key",
               in: {
                  key: "$$key",
                  status: {
                     $filter: {
                        input: "$statuses",
                        as: "status",
                        cond: { $eq: ["$$status.key", "$$key"] }
                     }
                  }
               }
            }
         }
      }
   },
   {
      $set: {
         statuses: {
            $map: {
               input: "$statuses",
               in: { key: "$$this.key", value: { $sum: "$$this.status.value" } }
            }
         }
      }
   }
])

如果您喜欢$group,那么使用这个:

代码语言:javascript
复制
db.collection.aggregate([
   { $unwind: "$statuses" },
   {
      $group: {
         _id: { field1: "$field1", field2: "$field2", field3: "$field3", status: "$statuses.key" },
         value: { $sum: "$statuses.value" }
      }
   },
   {
      $group: {
         _id: { field1: "$_id.field1", field2: "$_id.field2", field3: "$_id.field3" },
         statuses: { $push: { key: "$_id.status", value: "$value" } }
      }
   },
   { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$_id"] } } },
   { $unset: "_id" }
])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64225578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档