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

How to update embedded document in mongoose?

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

1个答案

1

在 Mongoose 中,更新嵌入文档(也称为子文档)通常涉及以下几个步骤:

1. 定位主文档

首先,你需要找到包含嵌入文档的主文档。这通常通过主文档的 _id 实现。

2. 更新嵌入文档

一旦找到主文档,你可以使用数组索引或某个标识来访问并更新嵌入文档的字段。

3. 保存更改

更新嵌入文档后,需要保存主文档以持久化更改。

示例:

假设有一个 User 模型,其中包含一个嵌入的 addresses 文档数组。每个地址文档都有一个 streetcity 字段。

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

现在,如果我们想要更新某个用户的特定地址,我们可以按照以下步骤操作:

javascript
User.findById(userId, (err, user) => { if (err) { console.log(err); return; } // 假设我们更新第一个地址 const address = user.addresses[0]; address.street = "新的街道名称"; address.city = "新的城市"; // 保存更新 user.save((err) => { if (err) { console.log(err); } else { console.log('用户地址更新成功'); } }); });

替代方法:使用 findOneAndUpdate

如果你不想首先加载整个用户文档,也可以使用 findOneAndUpdate 方法,结合 $set 来直接更新特定的嵌入文档字段:

javascript
const update = { $set: { 'addresses.0.street': '新的街道名称', 'addresses.0.city': '新的城市' } }; User.findOneAndUpdate({_id: userId}, update, {new: true}, (err, user) => { if (err) { console.log(err); } else { console.log('用户地址更新成功', user); } });

这里,addresses.0.street 表示更新 addresses 数组中第一个元素的 street 字段。{new: true} 选项确保返回的是更新后的文档。

总结

更新 Mongoose 中的嵌入文档可以通过直接操作文档后调用 save 方法或使用 findOneAndUpdate 进行更精细的更新。选择哪种方法取决于你的具体需求,包括是否需要在更新前后处理数据或执行某些验证。

2024年6月29日 12:07 回复

你的答案