MongoDB聚合阶段提取指定状态时间并保留原Log数组方案咨询
MongoDB聚合:提取Start状态时间或使用当前时间(不使用$unwind)
解决方案聚合管道
db.collection.aggregate([ { $addFields: { startLogItem: { $arrayElemAt: [ { $filter: { input: "$Log", cond: { $eq: ["$$this.status", "Start"] } } }, 0 ] } } }, { $addFields: { StartTime: { $ifNull: [ "$startLogItem.time", { $dateToString: { format: "%m/%d/%Y %H:%M:%S", date: new Date() } } ] } } }, { $project: { StartTime: 1, Log: 1, _id: 0 } } ])
各阶段说明
- 第一个$addFields:通过
$filter筛选Log数组中status为"Start"的元素,再用$arrayElemAt取第一个匹配项存入临时字段startLogItem,完全保留原Log数组。 - 第二个$addFields:用
$ifNull做判断:如果startLogItem存在,直接提取它的time值;如果不存在,用$dateToString将当前时间转为和示例中一致的格式(MM/DD/YYYY HH:MM:SS)。 - $project:仅保留需要的
StartTime和原Log字段,移除临时字段与默认_id。
格式调整说明
如果需要ISO格式的当前时间,可将$dateToString部分替换为$now(MongoDB 4.0+支持),直接生成ISO标准时间字符串。
输出示例
- 存在Start状态的文档输出:
{ "StartTime": "09/02/2023 06:17:51", "Log": [/* 原完整Log数组 */] }
- 无Start状态的文档输出:
{ "StartTime": "09/15/2024 14:30:00", "Log": [/* 原完整Log数组 */] }
内容的提问来源于stack exchange,提问作者Sachin ganeshkar
相关产品推荐
相关产品推荐

