PAYATHON 2026

MongoDB 如何按 House 的 _id 修改嵌套 Residents 数组?

数据阿明

结论

使用 arrayFilters 定位 Houses 数组中的 House,再通过 Houses.$[house].Residents 指向该 House 的 Residents 数组。添加居民时使用 $addToSet,移除居民时使用 $pull。

以下示例使用 Suburb _id 000000000000000000001001 和 House _id 000000000000000000002002。请将示例中的居民字符串替换为要添加或移除的值。

添加居民

$addToSet 只会在居民尚未存在时添加该值,因此不会产生重复项:

db.Suburbs.findOneAndUpdate(
  { _id: ObjectId("000000000000000000001001") },
  {
    $addToSet: {
      "Houses.$[house].Residents": "New Resident"
    }
  },
  {
    arrayFilters: [
      { "house._id": ObjectId("000000000000000000002002") }
    ]
  }
);

如果需要每次都追加该值,包括数组中已有相同值的情况,可以将 $addToSet 换成 $push。

移除居民

$pull 会从匹配的 Residents 数组中移除所有等于指定值的元素。下面的例子会从该 House 中移除 Johnny:

db.Suburbs.findOneAndUpdate(
  { _id: ObjectId("000000000000000000001001") },
  {
    $pull: {
      "Houses.$[house].Residents": "Johnny"
    }
  },
  {
    arrayFilters: [
      { "house._id": ObjectId("000000000000000000002002") }
    ]
  }
);

注意事项

  • 更新路径中的 $[house] 是数组过滤占位符。arrayFilters 中的 house._id 用来匹配目标 House,两处的占位符名称必须一致。
  • 顶层过滤条件先选中 Suburb,arrayFilters 再选中其中的 House。更新路径因此只会作用于匹配 House 的 Residents 数组。
  • $addToSet 和 $pull 的更新值是数组元素的值。如果 Residents 中存放的是对象,需要根据对象结构和目标字段编写更新条件。

备注:内容仅供参考。