joh*_*ohn 2 mongodb mongodb-query aggregation-framework
我有一个 Mongo 集合,如下所示:
[{
id: 1,
timestamp: 1534488870841,
type: 'deposit'
}, {
id: 1,
timestamp: 1534488915119,
type: 'deposit'
}]
Run Code Online (Sandbox Code Playgroud)
如何查询以列出deposit按月份分组的所有交易。
必须使用timestamp属性(UNIX 毫秒)计算月份。
我可以按如下方式获得存款,但我不确定如何分组:
db.getCollection('transactions').find(
{"type":"deposit"});
Run Code Online (Sandbox Code Playgroud)
编辑:Mongo 3.4 版
您可以在 mongodb 4.0 中尝试以下聚合
您可以timestamp使用$toDate聚合转换为日期,然后$group 使用$month 聚合
db.collection.aggregate([
{ "$match": { "type": "deposits" }},
{ "$addFields": {
"date": {
"$toDate": "$timestamp"
}
}},
{ "$group": {
"_id": { "$month": "$date" },
"deposits": {
"$push": "$$ROOT"
}
}}
])
Run Code Online (Sandbox Code Playgroud)
您可以在 mongodb 3.4 中尝试以下聚合
在3.4 中,您可以timestamp通过添加new Date()它并$group使用$dateToString聚合来转换为日期
db.collection.aggregate([
{ "$match": { "type": "deposits" }},
{ "$addFields": {
"date": {
"$add": [ new Date(0), "$timestamp" ]
}
}},
{ "$group": {
"_id": {
"$dateToString": {
"format": "%m",
"date": "$date"
}
},
"deposits": {
"$push": "$$ROOT"
}
}}
])
Run Code Online (Sandbox Code Playgroud)