从 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()

我对@9​​87654325@ 所做的更改是否仍然存在?我希望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 对象?

mongoose中Documents的save方法

使用node js mongoose保存后如何返回json数据

Mongoose .save() 不能在没有回调的情况下工作