MongoDB多文档合并为单文档的实现及Playground操作问询
如何在MongoDB Playground中合并多文档为单个指定格式文档?
根据你给出的文档示例和期望输出,我给你整理了一套可以直接在MongoDB Playground中运行的解决方案,用聚合管道就能轻松实现:
步骤1:先插入测试数据
首先在Playground里创建测试用的文档:
db.collection.insertMany([ { _id: "abcdef", name: "foo", time: [1234], doc: [1234] }, { _id: "alexa", name: "alexa", time: [1234], doc: [1234] } ])
步骤2:使用聚合管道合并文档
接下来执行聚合查询,就能得到你想要的合并结果:
db.collection.aggregate([ // 聚合所有文档,收集time字段和name与doc的对应关系 { $group: { _id: null, // 按null分组表示把所有文档聚合成一组 time: { $first: "$time" }, // 假设所有文档的time值一致,取第一个即可 nameDocPairs: { $push: { k: "$name", v: "$doc" } } // 收集name作为键,doc作为值的键值对数组 } }, // 将收集到的键值对数组转换成对象,并和time字段合并成最终文档 { $replaceRoot: { newRoot: { $mergeObjects: [ { time: "$time" }, { $arrayToObject: "$nameDocPairs" } ] } } } ])
结果说明
执行上面的聚合后,你会得到如下输出(符合JSON标准格式,和你的期望逻辑一致):
{ "time": [1234], "foo": [1234], "alexa": [1234] }
额外调整说明
如果你的文档中time字段存在不同的值,需要按time分组合并的话,只需要把$group阶段的_id改成"$time"即可:
db.collection.aggregate([ { $group: { _id: "$time", // 按time值分组 nameDocPairs: { $push: { k: "$name", v: "$doc" } } } }, // 后续阶段调整为把_id作为time字段 { $replaceRoot: { newRoot: { $mergeObjects: [ { time: "$_id" }, { $arrayToObject: "$nameDocPairs" } ] } } } ])
内容的提问来源于stack exchange,提问作者bc110402922
相关产品推荐
相关产品推荐

