Mongoose findOne获取文档引用还是副本?save操作是更新还是新增?
Mongoose中findOne与save的行为解析
findOne返回的是引用还是副本?
findOne查询返回的是绑定了数据库原记录的Mongoose文档对象引用,并非独立的数据副本。这个文档对象携带了原记录的_id等唯一标识,和数据库中的对应记录处于关联状态——你对该对象字段的修改,本质是在修改这个关联对象的属性。
save操作是更新还是新增?
save的行为完全取决于调用它的文档对象状态:
- 如果文档对象是从数据库查询得到的(带有已存在的
_id),调用save()会执行原文档更新操作(底层对应MongoDB的updateOne逻辑),将修改后的字段同步回数据库中的原记录,不会生成新文档。 - 如果文档对象是全新创建的(比如用
new Model()生成、无_id或_id未在数据库中存在),调用save()才会执行新增文档操作(底层对应MongoDB的insertOne逻辑),在数据库中创建一条新记录。
示例代码
更新原文档的场景:
// 查询数据库中已存在的文档 const existingDoc = await YourModel.findOne({ _id: 'your-document-id' }); // 修改文档的items字段 existingDoc.items.push({ name: 'new-item' }); // 执行save,更新原数据库记录 await existingDoc.save();
新增文档的场景:
// 创建全新的文档对象 const newDoc = new YourModel({ items: [{ name: 'initial-item' }] }); // 执行save,插入新记录到数据库 await newDoc.save();
内容的提问来源于stack exchange,提问作者Ujjal Shrestha
相关产品推荐
相关产品推荐

