如何使用pyMongo聚合展开嵌套Stock数组生成指定结构的独立文档
解决方案
你只需要在现有聚合逻辑基础上补充$unwind拆分Stock数组,再做一次字段映射即可实现需求,完整聚合语句如下:
db.getCollection('File').aggregate([ // 拆分Stock数组,每个数组元素对应生成一条独立文档 { "$unwind": "$Stock" }, // 按规则映射目标字段,同时做对应类型转换 { "$project": { "_id": 0, // 不需要默认_id字段可保留该行,否则删除即可 "item_id": "$Id", "store": "$Stock.Code", "price": { "$toDouble": "$Price.Base" }, "quantity": { "$toInt": "$Stock.Qty" }, "sale_price": { "$toDouble": "$Price.Promo" } } } ])
pyMongo 调用示例
直接将上述管道作为参数传入pyMongo的aggregate方法即可执行:
from pymongo import MongoClient # 初始化连接 client = MongoClient('你的MongoDB连接串') db = client['你的数据库名称'] collection = db['File'] # 定义聚合管道 pipeline = [ {"$unwind": "$Stock"}, { "$project": { "_id": 0, "item_id": "$Id", "store": "$Stock.Code", "price": {"$toDouble": "$Price.Base"}, "quantity": {"$toInt": "$Stock.Qty"}, "sale_price": {"$toDouble": "$Price.Promo"} } } ] # 执行聚合 result = collection.aggregate(pipeline) # 遍历获取结果 for item in result: print(item)
补充说明
- 如果不需要强制转换字段类型,直接写字段路径即可,比如
"price": "$Price.Base" - $unwind必须放在字段映射步骤之前,才能正确拆分数组后匹配每个Stock子字段
- $project步骤已经指定了仅输出目标字段,原文档的Price、Stock等冗余字段会自动排除,不需要额外写$unset
内容的提问来源于stack exchange,提问作者OdiumPura
相关产品推荐
相关产品推荐

