You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:46:16