假设我有一个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
的值重写为零。
任何人都可以确认第二种情况是不可能的,也许可以说明猫鼬是如何处理这种情况的吗?
谢谢!
答案 0 :(得分:1)
并且可能会对猫鼬的处理方式有所了解?
docs中没有解释Mongoose如何在内部处理.save()
。但是看一下source code,似乎直到某个点(在调用MongoDB本机驱动程序之前)才使用相同的对象,因为Javascript对象作为引用传递,也许第一次调用会使用更新的对象。
但是我们在这里谈到异步操作,一旦将信息发送到MongoDB,我们就不知道在得到响应之前会发生什么。我认为我们永远不应该依赖这样的异步操作,你应该总是等待.save()
完成后调用的回调,然后再做第二次。
任何人都可以确认第二种情况不可能
所以回答这个问题,我认为第二种情况是可能的。可能由于某种原因,第一次调用MongoDB(在更新对象之前)在第二次调用之后完成。
在本地计算机中,通常按照您调用它的顺序完成。但是根据环境不能以相同的顺序执行,有很多原因。