我是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 :"
对此的任何见解都会非常有帮助。谢谢!
答案 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
作为普通布尔值。