在MongoDB中,使用ID更新文档中的嵌套数组

编程语言 2026-07-11

我正在使用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") }
     ]
  }
)

用于添加的Mongo Playground

移除/取出一个居民

使用 $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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章