我有MongoDB集合,它以这种格式存储文档:
"name" : "Username",
"timeOfError" : ISODate("...")我使用这个集合来跟踪谁得到了一个错误以及它发生的时间。
我现在要做的是创建一个查询,用于检索每个用户、每个月或其他类似的错误。就像这样:
{
"result": [
{
"_id": "$name",
"errorsPerMonth": [
{
"month": "0",
"errorsThisMonth": 10
},
{
"month": "1",
"errorsThisMonth": 20
}
]
}
]
}我尝试了几个不同的查询,但没有一个给出了想要的结果。最接近的结果来自于以下查询:
db.collection.aggregate(
[
{
$group:
{
_id: { $month: "$timeOfError"},
name: { $push: "$name" },
totalErrorsThisMonth: { $sum: 1 }
}
}
]
);这里的问题是,$push只是为每个错误添加用户名。所以我得到了一个有重复名字的数组。
发布于 2014-06-30 08:58:04
您需要在_id中复合$group值
db.collection.aggregate([
{ "$group": {
"_id": {
"name": "$name",
"month": { "$month": "$timeOfError" }
},
"totalErrors": { "$sum": 1 }
}}
])_id本质上是“分组键”,所以不管您想要分组的任何元素都需要成为其中的一部分。
如果您想要一个不同的顺序,那么可以更改分组键优先级:
db.collection.aggregate([
{ "$group": {
"_id": {
"month": { "$month": "$timeOfError" },
"name": "$name"
},
"totalErrors": { "$sum": 1 }
}}
])或者,如果您甚至希望或在管道中有不同字段的其他条件,只需在最后添加一个$sort管道阶段:
db.collection.aggregate([
{ "$group": {
"_id": {
"month": { "$month": "$timeOfError" },
"name": "$name"
},
"totalErrors": { "$sum": 1 }
}},
{ "$sort": { "_id.name": 1, "_id.month": 1 } }
])从本质上说,你可以对你想要的任何东西进行$sort。
https://stackoverflow.com/questions/24486311
复制相似问题