MongoDB聚合:如何将聚合结果的值转为键合并为单文档?
实现MongoDB聚合结果的结构转换
当然可以实现这个结构转换!你只需要在现有聚合管道的基础上补充几个阶段,就能把多文档数组转换成以_id为键的单文档。
完整的聚合查询
collection.aggregate([ // 保留原有处理trendingStats默认值的阶段 { $project: { 'trendingStats': { '$ifNull': ['$trendingStats', {'trendingArr': [], 'trendingScore': 0}] } } }, // 将所有文档分组为一个集合,收集_id和对应的trendingStats { $group: { _id: null, docs: { $push: { k: '$_id', // 用原文档的_id作为对象的键 v: '$trendingStats' // 对应的value是处理后的trendingStats } } } }, // 将数组转换为对象,并替换根文档 { $replaceRoot: { newRoot: { $arrayToObject: '$docs' } } } ]);
各阶段作用解释
- $project阶段:和你原来的逻辑一致,确保每个文档的
trendingStats字段都有值,不存在的话就用默认的空数组和0分的结构填充。 - $group阶段:通过
_id: null把所有聚合后的文档合并成一组,然后用$push把每个文档的_id(作为键k)和trendingStats(作为值v)收集成一个数组。 - $replaceRoot + $arrayToObject阶段:
$arrayToObject会把docs数组里的k-v结构转换成对象,再通过$replaceRoot把这个对象作为最终的根文档返回,就得到了你想要的格式。
最终输出结果
{ "5a9433fee5878a000f7cba09": {"trendingArr": [], "trendingScore": 0}, "5a942f79e5878a000f7cba06": {"trendingArr": [], "trendingScore": 0} }
内容的提问来源于stack exchange,提问作者user3302146
相关产品推荐
相关产品推荐

