【发布时间】:2021-07-21 14:33:31
【问题描述】:
我有以下格式的集合或订单:
"createTime" : ISODate("2021-04-16T08:01:39.000Z"),
"statusDetails" : [
{
"createTime" : ISODate("2021-04-16T08:01:39.000Z"),
"createUser" : "FOP-SYSTEM",
"stateOccurTimeStr" : "2021-04-16 15:01:39",
"status" : 27,
"statusDesc" : "Shipped"
}
]
createTime 显示订单的创建时间
statusDetails.status = 27 显示订单已发货
statusDetails.createTime 显示订单何时发货
我需要的结果是这样的:
| Order Date | 0-4 Hours | 4-8 Hours | 8-12 Hours | 12-24 Hours | > 24 Hours | Total Orders |
|---|---|---|---|---|---|---|
| 01-Jan-21 | 15 | 10 | 4 | 1 | 1 | 31 |
这表明在订单创建后的“2021 年 1 月 1 日”,
15 orders shipped between 0-4 hours,
10 orders shipped between 4-8 hours,
4 orders shipped between 8-12 hours
等等。
到目前为止我所做的是:
db.orders.aggregate([
{ $unwind : "$statusDetails"},
{$match: {"statusDetails.status": { "$exists": true, "$eq": 24 }}},
{$project : { createTime: 1,statusDetails:1,
dateDiff: {"$divide" : [{ $subtract: ["$statusDetails.createTime","$createTime" ] },3600000]}}},
{$sort:{"createTime":-1}}
])
但这显示了每条记录的时间差,但我需要分组
编辑 我更新了我的查询,现在它使用 $group 显示记录,但我仍然需要添加另一个管道来对当前数据进行分组。
db.orders.aggregate([
{ $unwind : "$statusDetails"},
{$match: {"statusDetails.status": { "$exists": true, "$eq": 27 }}},
{$project : { createTime: 1,statusDetails:1, dateDiff:{"$floor": {"$divide" : [{ $subtract: ["$statusDetails.createTime","$createTime" ] },3600000]}}}},
{
$group:
{ _id: { year : { $year : "$createTime" }, month : { $month : "$createTime" }, day : { $dayOfMonth : "$createTime" }},
shippedTime: { $push: "$dateDiff" },
count: { $sum: 1 }
}
},
{$sort:{"createTime":-1}}
])
【问题讨论】:
-
您可以在管道末尾添加一个 $group 阶段 - 并按订单日期分组。
-
是的,我在项目 { $group: { _id: { year : { $year : "$createTime" }, month : { $month : "$createTime" }, day : { $dayOfMonth : "$createTime" }}, avgTime: { $avg: "$dateDiff" } } },但这并不能解决问题
标签: database mongodb data-science aggregation