MongoDB嵌套数据集聚合查询构建方法咨询
针对嵌套数据集的MongoDB聚合查询构建指南
没问题!我给你拆解一下针对嵌套数据集构建MongoDB聚合查询的思路,先拿一个常见场景举例,你可以对照自己的实际数据调整:
假设的原始嵌套数据集
比如你的集合里是带嵌套产品数组的分类文档:
{ "_id": ObjectId("60d21b4667d0d8992e610c85"), "category": "electronics", "products": [ { "name": "laptop", "price": 999, "tags": ["portable", "high-performance"] }, { "name": "phone", "price": 699, "tags": ["compact", "camera"] } ] }, { "_id": ObjectId("60d21b4667d0d8992e610c86"), "category": "home", "products": [ { "name": "blender", "price": 49, "tags": ["kitchen", "small-appliance"] } ] }
假设的预期输出
比如你想要按分类统计平均产品价格,同时整理所有关联标签:
[ { "category": "electronics", "avgProductPrice": 849, "allTags": ["portable", "high-performance", "compact", "camera"] }, { "category": "home", "avgProductPrice": 49, "allTags": ["kitchen", "small-appliance"] } ]
对应的聚合查询
db.yourCollectionName.aggregate([ // 1. 展开嵌套的products数组,让每个产品成为独立文档 { $unwind: "$products" }, // 2. 按category分组,计算平均价格并收集所有标签数组 { $group: { _id: "$category", avgProductPrice: { $avg: "$products.price" }, tagsList: { $push: "$products.tags" } } }, // 3. 把二维标签数组扁平化并去重 { $addFields: { allTags: { $reduce: { input: "$tagsList", initialValue: [], in: { $setUnion: ["$$value", "$$this"] } } } } }, // 4. 调整输出字段结构,让结果更符合预期 { $project: { _id: 0, category: "$_id", avgProductPrice: 1, allTags: 1 } } ])
关键阶段解释
- $unwind:如果你的嵌套结构是数组,这一步是核心——把数组拆分成单个文档,让你能直接操作数组内的字段。如果是多层嵌套数组,可能需要多次调用
$unwind。 - $group:按你需要的维度(比如这里的category)分组,用MongoDB的聚合操作符(
$avg、$sum、$push等)计算统计值或收集数据。 - $addFields + $reduce:解决嵌套数组收集后的扁平化问题,这里用
$setUnion还顺便做了标签去重,如果不需要去重,换成$concatArrays即可。 - $project:最后调整输出的字段名称和显示结构,隐藏不需要的临时字段。
如果你的嵌套结构是单个嵌套文档而非数组(比如每个文档里有info.detail.price这类字段),那不需要$unwind,直接用点语法访问嵌套字段就行,比如$avg: "$info.detail.price"。
内容的提问来源于stack exchange,提问作者Vinod R
相关产品推荐
相关产品推荐

