如何解决MongoDB:按年/月使用嵌套值获取总和
我正在尝试将具有嵌套金额的集合(按月/年支出)相加-没有运气。
这是集合(提取):
[
{
"_id" : ObjectId("5faaf88d0657287993e541a5"),"segment" : {
"l1" : "Segment A","l2" : "001"
},"invoiceNo" : "2020.10283940","invoicePos" : 3,"date" : ISODate("2019-09-06T00:00:00.000Z"),"amount" : {
"document" : {
"amount" : NumberDecimal("125.000000000000"),"currCode" : "USD"
},"local" : {
"amount" : NumberDecimal("123.800000000000"),"currCode" : "CHF"
},"global" : {
"amount" : NumberDecimal("123.800000000000"),"currCode" : "CHF"
}
}
},...
]
我想用“全球”货币总结每月的发票总额。
我在MongoDB上尝试了此查询:
db.invoices.aggregate(
{$project : {
month : {$month : "$date"},year : {$year : "$date"},amount : 1
}},{$unwind: '$amount'},{$group : {
_id : {month : "$month",year : "$year" },total : {$sum : "$amount.global.amount"}
}})
我得到的结果是:
/* 1 */
{
"_id" : ObjectId("5faaf88d0657287993e541a5"),"currCode" : "CHF"
}
},"month" : 9,"year" : 2019
}
/* 2 */
{
"_id" : ObjectId("5faaf88d0657287993e541ac"),"amount" : {
"document" : {
"amount" : NumberDecimal("105.560000000000"),"local" : {
"amount" : NumberDecimal("105.560000000000"),"global" : {
"amount" : NumberDecimal("105.560000000000"),"month" : 11,"year" : 2020
}
但是,这不能汇总每月的所有发票,而是看起来像单个发票行-没有汇总。
我想得到这样的结果:
[
{
"month": 11,"year": 2020,"amount" : NumberDecimal("99999.99")
},{
"month": 10,{
"month": 9,"amount" : NumberDecimal("99999.99")
}
]
我的查询出了什么问题?
解决方法
这对您有帮助吗?
db.invoices.aggregate([
{
$group: {
_id: {
month: {
$month: "$date"
},year: {
$year: "$date"
}
},total: {
$sum: "$amount.global.amount"
}
}
},{$sort:{"_id.year":-1,"_id.month":-1}}
])
如果您需要任何其他说明,请告诉我,但是代码非常简短,不言自明。
,原则上,您的聚合管道很好,有一些错误:
- 聚合管道需要一个数组
-
$unwind
是无用的,因为$amount
不是数组。一元素->一文档 - 您可以直接使用日期功能
那么,简短而又简单:
db.invoices.aggregate([
{
$group: {
_id: { month: { $month: "$date" },year: { $year: "$date" } },total: { $sum: "$amount.global.amount" }
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。