You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:15:57