2013-04-13 47 views
0

我想通過put操作更新基本的CRUD樣式與REST api。我有一個coffeescript基類,其中@model是一個類似於mongoose模型的子類中的mongoose.model('Company',schema)。我要把圍繞兩個方面做PUT /更新:有沒有貓鼬的性能好處更新vs findByIdAndUpdate

und = require 'underscore' 

class CRUDApi 

    # using findByIdAndUpdate 
    update1: (req, res) => 
    data = und.clone req.body 
    delete data._id # so mongo doesn't complain 
    @model.findByIdAndUpdate req.params.id, data, (e, r) -> 
     res.send r 

    # using update 
    update2: (req, res) => 
    data = und.clone req.body 
    delete data._id # so mongo doesn't complain 
    @model.update { _id: req.params.id }, data, (e, r) -> 
     res.send req.body 

我的問題是:

1)是否有更新& findByIdAndUpdate之間的性能差異? findByIdAndUpdate似乎是一種更好的語法選擇,尤其是因爲它返回結果'r'而不是增量count,這比'僞裝'update2()中的req.body的響應要好2)另外它似乎很笨拙克隆請求,並刪除_.id屬性,所以貓鼬不抱怨。這是正常的方法嗎?

回答

3

1)如果要取回已更新的文檔,使用貓鼬的性能優勢findByXAndUpdate()。在下面,它使用了mongo的findAndModify方法,它有一個選項可以在更新後返回更新的文檔。另一種方法是在更新後執行find()以獲取文檔。返回發佈主體可能不是一個好的做法,因爲它不應該被信任,因爲它來自用戶,並且它不會考慮允許部分更新的返回完整文檔。

2)將來自req.body的傳入數據過濾到您期望的字段當然是一種很好的做法,尤其是在您將它們正確傳遞給模型的更新函數後。剝離_id似乎是合適的。