使用$out阶段的Mongoose Aggregation操作返回空数组如何解决?
原因说明
MongoDB 4.0及更早版本的$out阶段原生设计为仅将聚合管道结果写入目标集合,不会返回任何结果文档给客户端,回调返回空数组属于该版本下的正常逻辑,不是代码或环境故障。
解决方案
可根据业务场景任选以下方案实现写入集合同时获取聚合结果的需求:
- 方案一:升级MongoDB版本到4.4及以上
4.4版本新增的$merge阶段可完全覆盖$out的功能,同时支持返回写入的文档。将原$out配置替换为如下内容即可:
该配置效果与.append({ $merge: { into: "aggr_out", whenMatched: "replace", whenNotMatched: "insert" } })$out完全一致,会覆盖目标集合原有数据,同时聚合回调会返回所有写入的文档。 - 方案二:无需升级版本的替代实现
如果暂时无法升级数据库,可选择以下两种方式:- 先执行一次不带
$out的聚合查询拿到结果,再执行一次带$out的聚合写入集合,适合数据量小、对数据一致性要求不高的场景。 - 带
$out的聚合执行成功后,直接查询刚写入的aggr_out集合获取全量数据。该方案数据一致性更有保障,$out执行成功时数据已经完全写入目标集合,不会出现两次聚合结果不一致的问题。
- 先执行一次不带
内容的提问来源于stack exchange,提问作者fetahokey
相关产品推荐
相关产品推荐

