从 save() 返回后,mongoose 会覆盖对文档的本地更改吗?
Posted
技术标签:
【中文标题】从 save() 返回后,mongoose 会覆盖对文档的本地更改吗?【英文标题】:Does mongoose overwrite local changes to a document after returning from save()? 【发布时间】:2017-05-22 08:42:05 【问题描述】:假设我有一个猫鼬文档a
,看起来像:
field_1: 0, field_2: 0
然后我写:
a.field_1 = 1;
a.save()
稍后,在保存操作真正完成之前,我们有:
a.field_2 = 1:
a.save()
我对@987654325@ 所做的更改是否仍然存在?我希望a
的返回文档,在两者都保存后,看起来像:
field_1: 1, field_2: 1
我已经在我的机器上尝试过了,我确实得到了我想要的结果。但我担心这可能只是运气,我可能(不太可能)得到:
field_1: 1, field_2: 0
由于从初始保存返回的文档在调用第二次保存之前将我的field_2
值覆盖回零。
任何人都可以确认第二种情况是不可能的,或许可以阐明 mongoose 是如何处理这个问题的?
谢谢!
【问题讨论】:
【参考方案1】:也许可以阐明猫鼬是如何处理这个问题的?
在 docs 中没有解释 Mongoose 如何在内部处理 .save()
。但是看一下source code,似乎直到某个时候(在调用MongoDB本机驱动程序之前)都在使用同一个对象,因为javascript对象作为引用传递,也许第一个调用将使用更新的对象。
但是我们在这里谈论的是异步操作,一旦信息发送到 MongoDB,我们不知道会发生什么,直到我们得到响应。我认为我们永远不应该依赖这样的异步操作,你应该总是等待.save()
完成后调用的回调,然后再做第二个。
谁能确认第二种情况是不可能的
所以回答这个问题,我认为第二种情况是可能的。出于某种原因,对 MongoDB 的第一次调用(在更新对象之前)可能在第二次调用之后完成。
在您的本地机器上,它通常会按照您调用它的相同顺序完成。但是根据环境的不同,它不能以相同的顺序执行,原因有很多。
【讨论】:
以上是关于从 save() 返回后,mongoose 会覆盖对文档的本地更改吗?的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose .save() 返回空错误对象,不保存在数据库中
如何在 mongoose .save().then() 之外返回一个对象?
如何从 saveAsync 返回一个 Mongoose 对象?