首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取所有文档数组中的总金额

获取所有文档数组中的总金额
EN

Stack Overflow用户
提问于 2017-04-22 14:22:43
回答 3查看 770关注 0票数 1

我在用户集合中的文档如下:

代码语言:javascript
运行
复制
{
    "_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/

EN

Stack Overflow用户

发布于 2017-04-22 16:48:12

实现这一点的最佳方法实际上是在MongoDB版本3.4或更高版本中。这个版本的mon神明提供了$reduce运算符,它允许我们将$sum运算符应用到“金额”值的数组中,其中的“类型”是“现金”或“支票”。

但是首先,您需要通过$filter对"transaction“数组进行计算,并使用$map数组运算符只返回”$map“值。

$filter中的"cond“表达式是一个简单的$in表达式,在版本3.4中也是新的。

当然,要获得集合中所有文档的总数,您需要在$group阶段这样做,并使用null或与您的编程语言中相同的任何东西作为_id值。

代码语言:javascript
运行
复制
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的文档的总数。

代码语言:javascript
运行
复制
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"
         }
      }
   }
])
票数 -1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43560300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档