MongoDB聚合:如何在$group阶段用$push直接生成数组以省略$project
如何省略$project阶段直接在$group中构造并推送数组
我来帮你搞定这个问题!其实完全可以省略掉$project阶段,直接在$group里完成数组的构造和推送。你之前尝试出错大概率是因为没把数组结构正确嵌套在$push的参数里,下面是修正后的聚合管道:
{ $group: { _id: { type: "$_id.type" }, datapoints: { $push: [ { $multiply: ["$_id.timestamp", 1000] }, "$count" ] } } }
为什么这个写法可行?
原来的$project阶段只是把每个文档转换成包含type和datapoints数组的结构,现在我们直接把这个数组的构造逻辑移到了$group的$push操作里:
- 对每个进入$group阶段的文档,直接计算
{ $multiply: ["$_id.timestamp", 1000] }得到毫秒级时间戳 - 把这个计算结果和
$count值一起组成一个数组 - 最后通过
$push把这个数组追加到对应type分组的datapoints数组中
这样就完全替代了原来的两个阶段,逻辑和结果完全一致,还减少了管道步骤,效率更高。
需要注意:要确保你的原始数据(或$group之前阶段的输出)里确实存在_id.type、_id.timestamp和count字段,不然可能会出现null值或者计算异常哦。
内容的提问来源于stack exchange,提问作者the0ffh
相关产品推荐
相关产品推荐

