在MongoDB中,使用ID更新文档中的嵌套数组
我正在使用MongoDB 8.0.4和 Mongosh 2.3.8。
在使用下面的代码创建集合之后,我想更新位于一个 House 文档中的 Residents 的数组。House 文档也在其父文档(Suburb)的数组中。
db.Suburbs.insertOne({
_id: new ObjectId("000000000000000000001001"),
Location: "Virginia",
SuburbName: "Tanglewood",
Houses: [
{
_id: new ObjectId("000000000000000000002001"),
Address: "Mayberry Ln",
NumFloors: 2,
Residents: ["Harry", "Sally", "Junior"]
},
{
_id: new ObjectId("000000000000000000002002"),
Address: "Center St",
NumFloors: 1,
Residents: ["Johnny", "Corin", "Simmy"]
},
{
_id: new ObjectId("000000000000000000002003"),
Address: "Tinsletown",
NumFloors: 3,
Residents: ["Rufus", "Betty", "Corin"]
}
]})
目标有两点。要从 Residents 的数组中取出一个居民,或向其中添加一个居民。
下面的代码用于修改与 Residents 同一级别的一个值,但我不知道如何定位 Residents 数组中的值。
db.Suburbs.findOneAndUpdate(
{"_id": ObjectId("000000000000000000001001")},
{
$set: { "Houses.$[myIdentifier].NumFloors": 4}
},
{
arrayFilters: [ {"myIdentifier._id": ObjectId("000000000000000000002002")} ]
}
);
解决方案
从
Residents的数组中取出或添加一个居民。
要添加一个居民:
使用 $push 数组更新运算符 与用于 NumFloors 的相同数组过滤条件一起使用:
db.collection.update(
{ _id: ObjectId("000000000000000000001001") },
{
$set: { "Houses.$[myIdentifier].NumFloors": 4 },
$push: { "Houses.$[myIdentifier].Residents": "NewResident" } // add a new resident
},
{
arrayFilters: [
{ "myIdentifier._id": ObjectId("000000000000000000002002") }
]
}
)
要移除/取出一个居民:
使用 $pull 数组更新运算符:
db.collection.update(
{ _id: ObjectId("000000000000000000001001") },
{
$set: { "Houses.$[myIdentifier].NumFloors": 4 },
$pull: { "Houses.$[myIdentifier].Residents": "Corin" } // remove by name
},
{
arrayFilters: [
{ "myIdentifier._id": ObjectId("000000000000000000002002") }
]
}
)
用于拉取的Mongo Playground。请注意,在第三个房子里也有一个名为 'Corin' 的成员,但它只能从第二个房子中被移除,与数组过滤条件相匹配。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。