我在用户集合中的文档如下:
{
"_id" : ObjectId("58ca3a856d13601f9a474dca"),
"name" : "user A",
"email" : "userA@gmail.com",
"transaction" : [
{
"amount" : 50,
"type" : "CASH"
}
]
},
{
"_id" : ObjectId("58ca3a856d13601f9a474dcb"),
"name" : "user B",
"email" : "userB@gmail.com",
"transaction" : [
{
"amount" : 100,
"type" : "CHEQUE"
},
{
"amount" : 200,
"type" : "CASH"
},
{
"amount" : -20,
"type" : "USED_SERVICE"
}
]
},
{
"_id" : ObjectId("58ca3a856d13601f9a474dcc"),
"name" : "user C",
"email" : "userC@gmail.com",
"transaction" : [
{
"amount" : 20,
"type" : "CASH"
},
{
"amount" : -5,
"type" : "USED_SERVICE"
}
]
}我需要把所有用户的交易加在一起,比如现金或支票。
我尝试了$sum聚合操作符,但仍然不知道如何让它工作。
https://docs.mongodb.com/manual/reference/operator/aggregation/sum/
发布于 2017-04-22 16:48:12
实现这一点的最佳方法实际上是在MongoDB版本3.4或更高版本中。这个版本的mon神明提供了$reduce运算符,它允许我们将$sum运算符应用到“金额”值的数组中,其中的“类型”是“现金”或“支票”。
但是首先,您需要通过$filter对"transaction“数组进行计算,并使用$map数组运算符只返回”$map“值。
$filter中的"cond“表达式是一个简单的$in表达式,在版本3.4中也是新的。
当然,要获得集合中所有文档的总数,您需要在$group阶段这样做,并使用null或与您的编程语言中相同的任何东西作为_id值。
db.collection.aggregate([
{
"$group": {
"_id": null,
"total": {
"$sum": {
"$reduce": {
"input": {
"$map": {
"input": {
"$filter": {
"input": "$transaction",
"as": "t",
"cond": {
"$in": [
"$$t.type",
[
"CASH",
"CHEQUE"
]
]
}
}
},
"as": "elt",
"in": "$$elt.amount"
}
},
"initialValue": 0,
"in": {
"$add": [
"$$value",
"$$this"
]
}
}
}
}
}
}
])如果mongod版本为3.2,另一个效率较低的替代方法是使用"cond“表达式中的$setIsSubset运算符对”事务“数组进行$filter。
然后,计算另一个$project阶段中“$sum”值的总和,并在最后的$group阶段返回所有带有$group的文档的总数。
db.collection.aggregate([
{
"$project": {
"transaction": {
"$filter": {
"input": "$transaction",
"as": "t",
"cond": {
"$setIsSubset": [
[
"$$t.type"
],
[
"CASH",
"CHEQUE"
]
]
}
}
}
}
},
{
"$project": {
"amount": {
"$sum": "$transaction.amount"
}
}
},
{
"$group": {
"_id": null,
"total": {
"$sum": "$amount"
}
}
}
])https://stackoverflow.com/questions/43560300
复制相似问题