我正试着把我的数据按天分组--每周一次,每月一次,每年一次。我有日期,星期数,月和年在不同的字段。但我无法弄清楚如何在单个流中进行组聚合。以下是json样本:
{
"Ctrans" : {
"status" : "active"
},
"Day-month" : "25-9",
"Month" : 9,
"Year" : 2019,
"Week" : 38
} 我对这个管道的查询:
db.getCollection("transaction").aggregate(
[
{
"$lookup" : {
"from" : "customer",
"localField" : "pB.phone",
"foreignField" : "phone",
"as" : "Ctrans"
}
},
{
"$unwind" : {
"path" : "$Ctrans",
"includeArrayIndex" : "arrayIndex",
"preserveNullAndEmptyArrays" : false
}
},
{
"$project" : {
"date" : {
"$dateFromString" : {
"dateString" : "$createdAt",
"onError" : "$date"
}
},
"Weekdate" : {
"$dateFromString" : {
"dateString" : "$createdAt",
"onError" : "$date"
}
},
"Ctrans.status" : 1.0,
"createdAt" : 1.0
}
},
{
"$project" : {
"date" : {
"$dateToParts" : {
"date" : "$date"
}
},
"week" : {
"$week" : "$Weekdate"
},
"Ctrans.status" : 1.0
}
},
{
"$project" : {
"Day-month" : {
"$concat" : [
{
"$toString" : "$date.day"
},
"-",
{
"$toString" : "$date.month"
}
]
},
"Month" : "$date.month",
"Year" : "$date.year",
"Week" : "$week",
"Ctrans.status" : 1.0
}
},
{
"$group" : {
"_id" : {
"Today" : "$Day-month",
"Status" : "$status"
},
"Total" : {
"$sum" : 1.0
}
}
}
],
{
"allowDiskUse" : false
}
);我的目标是用:(Day-month, status),(month,status),(year,status),(week,status)对分组进行分组,并分别得到每个配对组的计数。
发布于 2019-11-18 05:00:21
可以使用$facet对数据集应用单独的$group阶段,尝试:
db.collection.aggregate([
// current aggregation stages,
{
$facet: {
"dayMonthStatus": [
{ $group: { _id: { status: "$Ctrans.status", "dayMonth": "$Day-month" }, count: { $sum: 1 } } }
],
"monthStatus": [
{ $group: { _id: { status: "$Ctrans.status", "month": "$Month" }, count: { $sum: 1 } } }
],
"yearStatus": [
{ $group: { _id: { status: "$Ctrans.status", "year": "$Year" }, count: { $sum: 1 } } }
],
"weekStatus": [
{ $group: { _id: { status: "$Ctrans.status", "week": "$Week" }, count: { $sum: 1 } } }
]
}
}
])https://stackoverflow.com/questions/58907845
复制相似问题