mongoose 聚合和求和嵌套的 OBJECT (NOT ARRAY ) 字段
Posted
技术标签:
【中文标题】mongoose 聚合和求和嵌套的 OBJECT (NOT ARRAY ) 字段【英文标题】:mongoose aggregate and sum nested OBJECT (NOT ARRAY ) fields 【发布时间】:2020-01-27 02:36:00 【问题描述】:我看到很多帖子使用aggregate
到sum
嵌套ARRAY
字段,我尝试将它与我的嵌套对象一起使用,但它不起作用。
当我查询时,数据结构类似于...
[
"key": "value",
"more_key": "more_value",
"meals":
"A":
"name": "salmon",
"amount": "8"
,
"B":
"name": "vege",
"amount": "6"
,
,
"key": "value",
"more_key": "more_value",
"meals":
"A":
"name": "salmon",
"amount": "8"
,
"B":
"name": "vege",
"amount": "6"
,
"C":
"name": "other meal",
"amount": "6"
,
,
];
我正在尝试总结amount
我已经尝试过这样的事情......
await Model.aggregate([
$match: isDeleted: false ,
$unwind: '$meals' , // tried with + without this
$group: _id: null, sum: $sumA: '$meals.A.amount', $sumB: '$meals.B.amount'
]);
有人可以给我一些关于如何做到这一点的建议和建议吗?
提前致谢。
【问题讨论】:
【参考方案1】:这里发生了一些事情:
1) $unwind
不适用于对象,仅适用于数组。您可以通过使用 $objectToArray
将餐点对象转换为数组来解决此问题
2)您的金额字段看起来像是字符串类型,因此需要将其转换为数字以进行求和
这是一个满足您需要的聚合:
await Model.aggregate([
// Convert meals object to array
$project: meals: $objectToArray: '$meals' ,
// unwind meals array
$unwind: '$meals' ,
// convert meals.v.amount to integer and sum them (the v is shorthand for values)
$group:
_id: null,
total:
$sum:
$convert:
input: '$meals.v.amount',
to: 'int'
])
您可以将 $group 的 _id 更改为 _id: meals.k
以通过餐点对象的键进行求和,即 A、B、C
【讨论】:
我想 $unwind: '$meals' ,
的意思是 $unwind: '$meals',
对吧?但我收到UnhandledPromiseRejectionWarning: MongoError: Unrecognized expression '$convert'
的错误消息
$convert 是 MongoDB 4.0 版中的新功能,但它已经发布了一年左右。你用的是什么版本?
如果由于某种原因无法更新到 4.x 版本,请参阅这篇文章了解如何在早期版本中将字符串转换为 int:***.com/questions/29487351/…
啊!难怪我一直在用$convert
和$toInt
搜索,每个人都在建议,刚刚检查了提供的沙箱使用的是 mongodb 3.6x >。parseInt 将值更改为 int 然后保存到 db 对吗?所以完全改变了 db 中的类型?
MongoDB 似乎在版本之间发生了相当大的变化,所以它可能有点令人沮丧,好吧!没错,代码是覆盖集合中的数据来改变类型。以上是关于mongoose 聚合和求和嵌套的 OBJECT (NOT ARRAY ) 字段的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用
如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)
mongoDB,带有 $sum 和 $count 的 mongoose 聚合查询