聚合查询中由另一个字段分组的两个 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 数组的总和的主要内容,如果未能解决你的问题,请参考以下文章