2017-01-07 49 views
0

比方說,我有一個貓鼬文件0​​,看起來像:從save()返回後,貓鼬會覆蓋文檔的本地更改嗎?

{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

並且也許揭示了貓鼬如何處理這個問題?

貓鼬在內部處理.save()的方式在docs中沒有說明。但看看source code,看起來直到某個點(在調用MongoDB本地驅動程序之前)才使用同一個對象,因爲Javascript對象作爲引用傳遞,也許第一個調用將使用更新目的。

但是我們在這裏講的是異步操作,一旦信息發送到MongoDB,我們不知道會發生什麼,直到我們得到響應。我認爲我們絕對不應該依賴這樣的異步操作,您應該始終等待.save()完成後調用的回調,然後執行第二個回調。

任何人都可以證實,第二種情況是不可能的

所以回答這個問題,我認爲第二種情況是可能的。由於某種原因,第一次調用MongoDB(在更新對象之前)可能會在第二次調用之後完成。

在您的本地機器中,通常會按照您調用它的相同順序完成。但取決於環境,它不能以相同的順序執行,這有很多原因。