Mongoose聚合后丢失字段:如何保留housename与adress字段?
解决Mongoose聚合查询中分组后丢失原字段的问题
你的问题出在聚合的$group阶段,只指定了_id和people字段,没有把housename和adress纳入分组结果中。下面提供两种可行的解决方案:
方案一:在$group阶段保留其他字段
因为你已经通过$match定位到了单个文档(按唯一的_id查询),所以在$group时可以用$first操作符提取housename和adress的值(同一分组内这些字段值唯一)。修改后的代码如下:
app.get("/api/test", (req, res) => { var searchID = "20"; var minAge = 21; House.aggregate([ { $match: { _id: searchID } }, { $unwind: "$people" }, { $match: { "people.age": { $gt: minAge } } }, { $group: { _id: "$_id", housename: { $first: "$housename" }, // 保留housename字段 adress: { $first: "$adress" }, // 保留adress字段 people: { $push: "$people" } } } ]).exec((err, data) => { res.json(data); }); });
方案二:使用$filter直接过滤数组(更高效)
不需要$unwind和$group,直接用$filter操作符在投影阶段过滤people数组,这种方式步骤更少、性能更优,还能自动保留所有原字段:
app.get("/api/test", (req, res) => { var searchID = "20"; var minAge = 21; House.aggregate([ { $match: { _id: searchID } }, { $addFields: { people: { $filter: { input: "$people", as: "person", cond: { $gt: ["$$person.age", minAge] } } } } } ]).exec((err, data) => { res.json(data); }); });
说明
$addFields会在原文档基础上替换people字段为过滤后的数组,同时自动保留所有其他原有字段(_id、housename、adress)。- 如果你的Mongoose版本支持,也可以用
$project实现,但$addFields无需手动列出所有要保留的字段,写法更简洁。
内容的提问来源于stack exchange,提问作者Gbr
相关产品推荐
相关产品推荐

