如何在Mongo聚合管道中将查询结果合并为_id映射legacy_id的单文档
问题:用Mongo聚合管道将多文档合并为_id与legacy_id的键值对文档
我的Mongo集合items查询结果如下:
db.items.find({})
返回数据:
[ { "_id": { "$oid": "64e929386a2bff904d86118a" }, "name": "Copies", "legacy_id": 181 }, { "_id": { "$oid": "64e929386a2bff904d86118b" }, "name": "Temp", "legacy_id": 182 }, { "_id": { "$oid": "64e929386a2bff904d86118c" }, "name": "Test", "legacy_id": 183 } ]
需要通过聚合管道直接将上述结果合并为单个文档,文档中以_id的字符串值为键,对应的legacy_id为值,期望结果如下:
[ { "64e929386a2bff904d86118a": 181, "64e929386a2bff904d86118b": 182, "64e929386a2bff904d86118c": 183 } ]
解决方案
可以通过以下聚合管道实现:
db.items.aggregate([ // 1. 将ObjectId类型的_id转为字符串,生成键值对结构的对象 { $project: { _id: 0, kv: { k: { $toString: "$_id" }, v: "$legacy_id" } } }, // 2. 将所有文档的键值对收集到一个数组中 { $group: { _id: null, keyValues: { $push: "$kv" } } }, // 3. 将数组转为对象,替换为根文档 { $replaceRoot: { newRoot: { $arrayToObject: "$keyValues" } } } ])
各阶段说明
- $project:转换_id为字符串格式,构造
{k: 键名, v: 键值}的结构,同时剔除不需要的字段。 - $group:以
null为分组键,将所有文档的kv对象收集到keyValues数组中。 - $replaceRoot:使用
$arrayToObject将数组转换为目标键值对对象,并设为根文档。
执行上述聚合命令后,即可得到期望的单个文档结果。
内容的提问来源于stack exchange,提问作者Snuh
相关产品推荐
相关产品推荐

