2016-10-04 22 views
0

貓鼬文檔mention此示例代碼:Mongoose update()真的更新了什麼?

Tank.findById(id, function (err, tank) { 
    if (err) return handleError(err); 

    tank.size = 'large'; 
    tank.save(function (err, updatedTank) { 
    if (err) return handleError(err); 
    res.send(updatedTank); 
    }); 
}); 

是否該結果到的MongoDB update()命令設置只是size屬性(即db.tanks.update({_id: tank._id}, {$set: {size: "large"}});)或這是否更換整個文件?

或者與其他詞,如果其他客戶端更新另一個屬性(比方說,color)剛過findById()的回報,但在執行前save()之前?是color然後恢復到以前的值或保持完好?

並且,在殼體貓鼬足夠聰明僅更新「改變」的屬性,究竟是(被比較的值之前/之後?或經由tank對象上的設定器?)來檢測?無論如何坦克size已經「大」了呢?

我問,因爲Mongoose docs不是對這個很清楚,我想了解如何貓鼬是設計打算在這方面使用

+0

應該比較容易測試自己。 – robertklep

+0

如果我沒有要測試的數據庫,則不需要。另外,測試並不能完全揭示圖書館應該做什麼。不好的測試會導致錯誤的假設。 –

+0

我懷疑你會從Mongoose的開發者那裏得到一個關於什麼是_supposed_發生的明確答案,尤其是因爲文檔不是確定性的。普通用戶在這裏發佈的答案是軼事。 – robertklep

回答

0

一些測試表明,Mongoose跟蹤對文檔的修改(通過使用setter,如您已經提到的),並將運行一個更新$set的新值。

所以這個:

tank.size = 'large'; 
tank.save(...); 

是(粗略地講)爲實現:

tankCollection.update({ _id : tank._id }, { $set : { size : 'large' } }, ...); 

如果size先前值也large,也不會進行更新。另外,如果文檔是新的,它將運行不同的代碼路徑(調用tankCollection.insert())。

因此併發更新應該能夠工作,只要它們不更新相同的屬性(在這種情況下,最後執行的更新會獲勝)。