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

同一异步函数中调用.save()与.create()为何仅生成一条MongoDB记录?

问题原因分析

你遇到的问题核心在于Mongoose文档实例的_id属性以及create方法的行为逻辑:

  • 当你通过new samplemodel()创建samplerecord实例时,Mongoose已经自动为这个实例生成了唯一的_id值,该_id已存在于内存中的实例对象里,哪怕还没保存到数据库。
  • 执行Line A的samplerecord.save()时,会把带有这个_id的记录插入到MongoDB中。
  • 当你在Line B把同一个samplerecord实例传给samplemodel.create()时,Mongoose检测到这个对象包含数据库中已存在的_id,此时create方法会触发upsert逻辑(即文档存在则更新,不存在则插入)。因为这条_id对应的记录已经被Line A插入,所以Line B实际只是更新了这条已存在的记录,不会创建新记录。

哪怕调换Line A和Line B的顺序,结果也一致:先执行create(samplerecord)会插入带_id的记录,之后执行save()时,因实例的_id已存在,save()会变成更新操作,最终仍只有一条记录。

解决方法

如果想要生成两条独立的记录,需避免传入带有已存在_id的对象给create方法,常见做法有两种:

  • 方法一:创建全新对象传给create

    await samplerecord.save(); // Line A
    await samplemodel.create({ name:'FFFF', age:26 }); // Line B,传入新对象
    
  • 方法二:克隆原实例并移除_id属性后传入create

    await samplerecord.save(); // Line A
    const newRecord = { ...samplerecord.toObject(), _id: undefined };
    await samplemodel.create(newRecord); // Line B,传入无重复_id的对象
    

内容的提问来源于stack exchange,提问作者Brijesh Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:43:15