如何使用$objectToArray将MongoDB订单日志按订单号合并为单条文档
MongoDB按订单号合并日志解决方案
你当前的问题核心是没有使用分组聚合阶段,仅对单条文档做字段投影自然无法合并同订单的多条记录,而且$objectToArray运算符不符合当前需求,它的作用是将单个对象转换为[{k:键名,v:键值}]格式的数组,不是用来做多文档聚合的。
正确的聚合查询语句如下:
db.collection.aggregate([ // 第一步:按订单号分组,合并同订单的所有日志 { $group: { _id: "$ordernumber", ordername: { $first: "$ordername" }, orderlogs: { $push: { status: "$status", modifiedat: "$modifiedat" } } } }, // 第二步:调整输出字段格式,符合预期效果 { $project: { _id: 0, ordernumber: "$_id", ordername: 1, orderlogs: 1 } } ])
语句逻辑说明
- $group阶段:以
ordernumber作为分组标识,同一个订单号的所有文档会被分到同一组$first用于提取同组内第一条文档的ordername(同一个订单号对应的订单名全局唯一,使用$first、$last均可)$push会把同组内每条文档的status和modifiedat组成的对象,依次放入orderlogs数组中
- $project阶段:去掉默认返回的
_id字段,将分组用的_id重命名为ordernumber,调整为你需要的输出结构
内容的提问来源于stack exchange,提问作者Jayven Javier
相关产品推荐
相关产品推荐

