同一异步函数中调用.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方法,常见做法有两种:
方法一:创建全新对象传给
createawait samplerecord.save(); // Line A await samplemodel.create({ name:'FFFF', age:26 }); // Line B,传入新对象方法二:克隆原实例并移除
_id属性后传入createawait samplerecord.save(); // Line A const newRecord = { ...samplerecord.toObject(), _id: undefined }; await samplemodel.create(newRecord); // Line B,传入无重复_id的对象
内容的提问来源于stack exchange,提问作者Brijesh Roy
相关产品推荐
相关产品推荐

