乐闻世界logo
搜索文章和话题

Mongoose 如何使用 findOneAndUpdate 更新子文档?

6 个月前提问
5 个月前修改
浏览次数43

1个答案

1

在 Mongoose 中,findOneAndUpdate 方法可以用来更新 MongoDB 文档中的数据。如果要更新子文档(即嵌套在文档中的文档),我们需要特别注意如何指定要更新的子文档的路径。

假设我们有一个名为 User 的模型,其中包含一个名为 addresses 的数组字段,每个数组项都是一个包含街道、城市和邮编的对象。我们的任务是更新特定用户的某个地址。

步骤 1: 定义模型

首先,我们需要定义模型:

javascript
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const addressSchema = new Schema({ street: String, city: String, zipCode: String }); const userSchema = new Schema({ name: String, addresses: [addressSchema] }); const User = mongoose.model('User', userSchema);

步骤 2: 使用 findOneAndUpdate 更新子文档

为了更新子文档中的数据,我们需要使用 MongoDB 的点表示法(dot notation)来指定要更新的字段路径。假设我们知道要更新的地址的 _id

javascript
const userId = '某个用户的_id'; const addressId = '要更新的地址的_id'; const newStreet = '新的街道名'; const newCity = '新的城市名'; const newZipCode = '新的邮政编码'; User.findOneAndUpdate( { _id: userId, 'addresses._id': addressId }, { $set: { 'addresses.$.street': newStreet, 'addresses.$.city': newCity, 'addresses.$.zipCode': newZipCode } }, { new: true } // 返回更新后的文档 ) .then(updatedDocument => { console.log('更新成功:', updatedDocument); }) .catch(error => { console.error('更新失败:', error); });

在这个示例中:

  • 我们使用 findOneAndUpdate 的第一个参数来查找正确的用户文档,同时确保子文档数组中有一个具有正确 _id 的地址。
  • 使用 $set 操作符来更新子文档中的具体字段。
  • 'addresses.$' 是 MongoDB 的位置占位符,用于指示符合数组查询条件的第一个元素。
  • { new: true } 选项确保返回更新后的文档。

通过这种方法,我们可以准确地更新嵌套在数组中的子文档,而不会影响到其他子文档的数据。

2024年6月29日 12:07 回复

你的答案