聚合查询中由另一个字段分组的两个 int 数组的总和

Posted

技术标签:

【中文标题】聚合查询中由另一个字段分组的两个 int 数组的总和【英文标题】:Sum of two int array in aggregation query grouped by another field 【发布时间】:2021-02-06 15:23:00 【问题描述】:

我是 MongoDB 新手,遇到了一些问题。我的文档包含我应该求和的固定大小的 int 数组。

mongo 可以在一个查询中对两个 int 数组求和吗?在我的例子中,字符串日期。

示例数据:

d:[1,2], date:"17-01-2020" d:[3,4], date:"17-01-2020" d:[5,6], date:"18-01-2020"

我想要的查询结果:

d:[4, 6], date:"17-01-2020" d:[5,6], date:"18-01-2020"

【问题讨论】:

数组中的数字是否准确且始终为 2? 不,我给了2个简单 【参考方案1】:

如果你有两个值的固定大小,那么你可以使用这个:

db.collection.aggregate([
    $group:  _id: null, data:  $push: "$d"   ,
   
      $set: 
         d: [
            $sum: $map:  input: "$data", in:  $first: "$$this"   ,
            $sum: $map:  input: "$data", in:  $last: "$$this"   
         ]
      
   ,
   $unset: "data"
])

任何长度都可以使用这个:

db.collection.aggregate([
    $group:  _id: null, data:  $push: "$d"   ,
   
      $set: 
         d: 
            $map: 
               input:  $range: [0,  $size:  $first: "$data"  ] ,
               as: "idx",
               in:  $sum:  $map:  input: "$data", in:  $arrayElemAt: ["$$this", "$$idx"]    
            
         
      
   
])

第一个数组决定了所有其他数组的长度。

另一种方法是:

db.collection.aggregate([
   $unwind:  path: "$d", includeArrayIndex: "idx"  ,
   $group:  _id: "$idx", d:  $sum: "$d"   ,
   $sort:  _id: 1  ,
   $group:  _id: null, d:  $push: "$d"   
])

或者如果您想添加其他字段:

db.collection.aggregate([
   $unwind:  path: "$d", includeArrayIndex: "idx"  ,
   $group:  _id: "$idx", d:  $sum: "$d" , date:  $first: "$date"   ,
   $sort:  _id: 1  ,
   $group:  _id: "$date", d:  $push: "$d"   ,
   $project:  d: 1, date: "$_id"  
])

即使数组的长度不同,这也有效。

【讨论】:

谢谢,有可变大小的解决方案吗,因为我有 1440 长度数组 在 mongo shell 上运行时出现错误:“无法识别的表达式 '$first'” $first/$last 在 Mongo v4.4 中引入。请改用 $arrayElemAt: ["$$this", 0] $arrayElemAt: ["$$this", 1] 另见我的第二个解决方案。我也试过$reduce,但失败了。 我试图用 go 编写查询。我认为第二个更容易写。谢谢!

以上是关于聚合查询中由另一个字段分组的两个 int 数组的总和的主要内容,如果未能解决你的问题,请参考以下文章

如何在数组的 mongodb 的子字段中进行聚合和分组?

Django聚合函数与分组查询

003.分组统计查询和表连接查询

Mongodb对来自聚合方面的两个相似数据数组进行分组和求和

Django 09-1模型层 查询(分组聚合)

我想在数据库中的一个表中查询出全部数据 并且按照一个分组和排序