如何在MongoDB Compass中按时间分组统计指定日期订单?
在MongoDB Compass中实现指定日期订单统计(等效SQL逻辑)
需要统计指定日期(2023-02-16)的订单数量,实现与以下SQL等效的逻辑:
SELECT count(1) num, date(creation_date) date FROM orders WHERE date(creation_date) = "2023-02-16" GROUP BY date
订单集合的文档模型示例:
{ "creation_date": { "$date": { "$numberLong": "1641981205813" } }, "user_id": { "$oid": "61dedd8b7a520461dd78016b" }, "products": [ { "_id": { "$oid": "61dede397a520461dd7818bd" }, "product_id": { "$oid": "615071ae8b66e1e9a3d6ea50" }, "payment": true, "support_all_payment": false, "term_ids": null } ], "carts_info": [ { "_id": { "$oid": "61dede397a520461dd7818be" }, "support_type": null, "support_price": 0, "product_price": 11000, "product_type": "all", "final_price": 11000, "product_id": { "$oid": "615071ae8b66e1e9a3d6ea50" } } ], "_des": "initial_payment", "_type": "online", "_token": "9e0cb4d111f642f1a6f482bb04f1f57b", "_price": 11000, "_status": "unpaid", "_terminal_id": "12605682", "__v": 0, "additional_information": { "saman_bank": { "MID": "0", "ResNum": "61dede387a520461dd7818bb", "State": "CanceledByUser", "TraceNo": "", "Wage": "", "Rrn": "", "SecurePan": "", "HashedCardNumber": "", "Status": "1" } } }
操作步骤
- 打开MongoDB Compass,连接目标数据库,选择
orders集合 - 切换到**聚合(Aggregation)**标签页,依次添加以下聚合阶段:
阶段1:筛选指定日期的订单(对应SQL的WHERE子句)
使用$match阶段过滤creation_date在目标日期当天的文档:
{ "$match": { "creation_date": { "$gte": ISODate("2023-02-16T00:00:00Z"), "$lt": ISODate("2023-02-17T00:00:00Z") } } }
说明:时间范围匹配比直接转换日期后匹配更高效,可利用
creation_date字段上的索引。
阶段2:提取日期字段(对应SQL的date(creation_date))
使用$addFields阶段将creation_date转换为YYYY-MM-DD格式的日期字符串:
{ "$addFields": { "date": { "$dateToString": { "format": "%Y-%m-%d", "date": "$creation_date" } } } }
阶段3:按日期分组并统计数量(对应SQL的GROUP BY和COUNT)
使用$group阶段按提取的date字段分组,统计订单总数:
{ "$group": { "_id": "$date", "num": { "$sum": 1 } } }
阶段4:重命名字段(可选,贴近SQL输出格式)
若需要将_id字段改为date,添加$project阶段:
{ "$project": { "_id": 0, "date": "$_id", "num": 1 } }
执行聚合查询后,将得到与目标SQL完全一致的结果,示例如下:
{ "date": "2023-02-16", "num": 123 }
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

