删除嵌套文档数组中的特定属性

Removing a specific attribute in an array of nested documents

对不起我的英语,我来自俄罗斯。

我问了俄文版的this question,但是他们还没有回答。

有一个记录 collection 存储档案文件。这是它的简化结构(我省略了大部分属性):

{
  "_id": 1,
  "tomes": [
    {
      "number":1,
      "archive_number":1
    },
    {
      "number":2,
      "archive_number":1
    }
  ]
}
{
    "_id": 2,
  "tomes": [
    {
      "number":1,
      "archive_number":1
    },
    {
      "number":2,
      "archive_number":1
    },
    {
      "number":3,
      "archive_number":1
    }
  ]
}

我需要从 tomes 数组中的所有文档的每个嵌套文档中删除 archive_number 属性记录 collection.

删除后,结构应该是这样的:

{
  "_id": 1,
  "tomes": [
    {
      "number":1,
    },
    {
      "number":2,
    }
  ]
}
{
    "_id": 2,
  "tomes": [
    {
      "number":1,
    },
    {
      "number":2,
    },
    {
      "number":3,
    }
  ]
}

我能够编写这样的查询:

db.record.update(
  {
    "tomes": {
      $elemMatch:{
        "archive_number":{$exists:true}
      }
    }
  },
  {
    $unset: {
      "tomes.$.archive_number":1
    }
  },
  false, true
)

但此查询仅删除每个存档案例一个卷上的 archive_number 属性。即启动后,我们会看到如下图:

{
  "_id": 1,
  "tomes": [
    {
      "number":1,
    },
    {
      "number":2,
      "archive_number":1
    }
  ]
}
{
    "_id": 2,
  "tomes": [
    {
      "number":1,
    },
    {
      "number":2,
      "archive_number":1
    },
    {
      "number":3,
      "archive_number":1
    }
  ]
}

你能告诉我如何删除所有卷吗?不知道怎么改正要求,脑袋都看不懂了

解决方案 1

使用 $[<indentifier>](过滤后的位置运算符)和 arrayFilters 更新数组中的文档。

db.collection.update({
  "tomes": {
    $elemMatch: {
      "archive_number": {
        $exists: true
      }
    }
  }
},
{
  $unset: {
    "tomes.$[tome].archive_number": 1
  }
},
{
  arrayFilters: [
    {
      "tome.archive_number": {
        $exists: true
      }
    }
  ],
  multi: true
})

Sample Mongo Playground (Solution 1)


解决方案 2

With $[](所有位置运算符)。

The all positional operator $[] indicates that the update operator should modify all elements in the specified array field.

db.collection.update({
  "tomes": {
    $elemMatch: {
      "archive_number": {
        $exists: true
      }
    }
  }
},
{
  $unset: {
    "tomes.$[].archive_number": 1
  }
},
{
  multi: true
})

Sample Mongo Playground (Solution 2)


参考资料

How the arrayFilters Parameter Works in MongoDB