MongoDB聚合查询如何直接返回数组字段中的所有元素项
可行实现方案
方案1:直接返回匹配预期格式的对象数组(最常用,推荐)
该方案返回的查询结果和你给出的预期输出完全一致,不需要额外二次处理:
db.collection.aggregate([ // 展开related数组,数组内每个对象生成一个独立文档 { $unwind: "$related" }, // 将related内的对象提升为根文档,自动移除外层所有多余字段 { $replaceRoot: { newRoot: "$related" } } ])
返回结果示例:
[ { "_id": "xxvxcv", "price": "5266", "title": "Title 1" }, { "_id": "fggfd", "price": "5266", "title": "Title 2" } ]
方案2:返回单个包裹的数组(适合需要整包接收的场景)
如果你需要所有结果合并为一个数组作为单个返回值,可使用该方案(要求MongoDB 4.4及以上版本):
db.collection.aggregate([ // 合并所有文档的related数组为一个嵌套数组 { $group: { _id: null, allRelated: { $push: "$related" } } }, // 扁平化数组并过滤多余字段 { $project: { _id: 0, result: { $concatArrays: "$allRelated" } } } ])
返回结果示例,取result字段即可得到目标数组:
[ { "result": [ { "_id": "xxvxcv", "price": "5266", "title": "Title 1" }, { "_id": "fggfd", "price": "5266", "title": "Title 2" } ] } ]
低版本兼容写法
如果你的MongoDB版本低于4.2不支持$replaceRoot,可手动指定字段映射实现相同效果:
db.collection.aggregate([ { $unwind: "$related" }, { $project: { _id: "$related._id", price: "$related.price", title: "$related.title" }} ])
内容的提问来源于stack exchange,提问作者Vishal Sharma
相关产品推荐
相关产品推荐

