【问题标题】:Sum of two int array in aggregation query grouped by another field聚合查询中由另一个字段分组的两个 int 数组的总和
【发布时间】: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个简单

标签: mongodb


【解决方案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 编写查询。我认为第二个更容易写。谢谢!
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多