从save()返回后,mongoose是否会覆盖对文档的本地更改?

时间:2017-01-07 18:43:18

标签: node.js mongodb mongoose

假设我有一个mongoose文档a,如下所示:

{field_1: 0, field_2: 0}
然后我写道:

a.field_1 = 1;
a.save()

以后一段时间,在保存操作实际完成之前,我们有:

a.field_2 = 1:
a.save()

我对field_2所做的更改是否仍然存在?我希望在两者都保存后,a的返回文档看起来像:

{field_1: 1, field_2: 1}

我已经在我的机器上试过了,我确实得到了我想要的结果。但我担心这可能只是运气而且我可能(不太可能)得到:

{field_1: 1, field_2: 0}

由于最初保存的返回文档在调用第二次保存之前将field_2的值重写为零。

任何人都可以确认第二种情况是不可能的,也许可以说明猫鼬是如何处理这种情况的吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

并且可能会对猫鼬的处理方式有所了解?

docs中没有解释Mongoose如何在内部处理.save()。但是看一下source code,似乎直到某个点(在调用MongoDB本机驱动程序之前)才使用相同的对象,因为Javascript对象作为引用传递,也许第一次调用会使用更新的对象。

但是我们在这里谈到异步操作,一旦将信息发送到MongoDB,我们就不知道在得到响应之前会发生什么。我认为我们永远不应该依赖这样的异步操作,你应该总是等待.save()完成后调用的回调,然后再做第二次。

  

任何人都可以确认第二种情况不可能

所以回答这个问题,我认为第二种情况是可能的。可能由于某种原因,第一次调用MongoDB(在更新对象之前)在第二次调用之后完成。

在本地计算机中,通常按照您调用它的顺序完成。但是根据环境不能以相同的顺序执行,有很多原因。