📜  mongodb 按 id 查找和更新数组项 (1)

📅  最后修改于: 2023-12-03 14:44:22.296000             🧑  作者: Mango

MongoDB 按 ID 查找和更新数组项

概述

在 MongoDB 中,我们可以通过使用 findOneAndUpdateupdateOne 方法来按 ID 查找和更新一个文档中的数组项。这在管理数据时非常有用。

使用方法
使用 findOneAndUpdate 方法
db.collection('collectionName').findOneAndUpdate(
  { _id: ObjectId('documentId') },
  { $set: { 'arrayFieldName.$[elementIndex].fieldName': 'newValue' } },
  { arrayFilters: [{ 'element.fieldName': 'filterValue' }] }
)

其中:

  • collectionName 是要操作的集合名称。
  • documentId 是要查找和更新的文档 ID。
  • arrayFieldName 是要操作的数组字段名。
  • elementIndex 是要更新的数组项索引。
  • fieldName 是要更新的数组项字段名。
  • newValue 是要更新的新值。
  • element.fieldName 是过滤数组项的条件字段名。
  • filterValue 是要过滤的值。

该方法将返回更新后的文档。

使用 updateOne 方法
db.collection('collectionName').updateOne(
  { _id: ObjectId('documentId') },
  { $set: { 'arrayFieldName.$[elementIndex].fieldName': 'newValue' } },
  { arrayFilters: [{ 'element.fieldName': 'filterValue' }] }
)

其中参数的含义和 findOneAndUpdate 方法相同。

该方法将返回更新的文档数量。

示例

假设我们有一个名为 users 的集合,其中每个文档包含如下结构的 languages 数组:

{
  _id: ObjectId('documentId'),
  name: 'John',
  languages: [
    { name: 'English', level: 'Expert' },
    { name: 'Chinese', level: 'Beginner' }
  ]
}

我们可以使用以下代码来查找和更新文档中数组 languages 中名为 English 的语言的级别:

db.collection('users').findOneAndUpdate(
  { _id: ObjectId('documentId') },
  { $set: { 'languages.$[elem].level': 'Intermediate' } },
  { arrayFilters: [{ 'elem.name': 'English' }] }
)

执行完毕后,该文档将被更新为:

{
  _id: ObjectId('documentId'),
  name: 'John',
  languages: [
    { name: 'English', level: 'Intermediate' },
    { name: 'Chinese', level: 'Beginner' }
  ]
}
总结

MongoDB 提供了强大的查找和更新数组项的功能,为我们解决数据管理方面的难题提供了非常方便的途径。使用时请注意参数的正确性和数据类型的匹配。