具有条件日期聚合的Mongo聚合

时间:2014-09-03 00:56:26

标签: mongodb mongodb-query aggregation-framework

我是mongo的新手,我正在尝试从我的mongo db集合中获得总金额的总和,名为" transactions"在哪里"付费"是真实的" creationDate"是在2014年9月,按天分组。

在Postgres中,我可以这样写:

select to_char("creationDate", 'YYYY-MM') as "Month", sum(totalamount)
from transactions
where "creationDate" >= '2014-09-01'
and paid is true
group by "Month"

但是,我不确定如何在Mongo中添加creationDate和pay的条件。我读了条件聚合,但我不知道如何让它在日期和月份以及逻辑条件下工作。

示例数据:

{ "totalamount" : 10, "creationDate" : ISODate("2014-09-01T01:00:58.909Z"), "paid" : true}
{ "totalamount" : 30, "creationDate" : ISODate("2014-09-01T03:00:58.909Z"), "paid" : true}
{ "totalamount" : 20, "creationDate" : ISODate("2014-09-02T01:00:58.909Z"), "paid" : true}

这就是我的尝试:

db.transactions.aggregate( 
[ 
    { 
        $group: 
            {
                _id:  {
                    day: { $dayOfMonth: "$creationDate"}, 
                    month: 
                        {
                            $cond: [{ $gte: [$month: "$creationDate", 9]},9,0]                                
                        }, 
                    year: 
                        {
                            $cond: [{ $gte: [$year: "$creationDate", 2014]},2014,0]                                
                        }, 

                    },
                collected: {
                    $sum: {
                        $cond: [
                            {"$paid":"true"}, "$totalamount",0]
                    } 
                }
            }
    } 
]
)

但是,我得到了"SyntaxError: Unexpected token :"

对此的任何见解都会非常有帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

在那里有一些问题,所以有点超出评论。大多数情况下,您没有使用{}包含多个日期运算符,因此会在数组中生成无效的JSON。如果您更改缩进样式以便更容易发现格式问题,也会有所帮助。

我个人更喜欢坚持使用完全严格的JSON表示法,它可以很好地解析其他语言并且更容易"lint",这是您应该注意的,以避免将来编码语法错误:

db.transactions.aggregate([
    { "$group": {
        "_id": {
            "day": { "$dayOfMonth": "$creationDate" }, 
            "month": {
                "$cond": [
                    { "$gte": [ {"$month": "$creationDate"}, 9 ] },
                    9,
                    0 
                ]                                
            }, 
            "year": {
                "$cond": [
                    { "$gte": [ { "$year": "$creationDate" }, 2014] },
                    2014,
                    0
                ]                                
            }
        }, 
        "collected": {
            "$sum": {
                "$cond": [
                    { "$eq": [ "$paid", "true" ] }, 
                    "$totalamount",
                    0
                ]
            } 
        }
    }}
])

最后,$sum的{​​{1}}缺少$eq的逻辑检查。让你真正意味着"字符串"价值"真"而且在这种情况下也不是true作为普通布尔值。