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中存放的是对象,需要根据对象结构和目标字段编写更新条件。
备注:内容仅供参考。
