2014-11-24 143 views
1

比方說,我有一個users集合在我的Mongo的數據庫:使用MongoDB嵌入集合(子文檔數組)違反REST?

users 
    _id 
    emailAddress 
    firstName 
    lastName 
    passwordHash 
    accessLogs: [ ... ] 
    createdAt 

正如你可以看到,用戶文檔可以包含accessLogs數組。大。

但是比方說,我想更新用戶記錄並對使用此數據庫的RESTful API執行PUT /users/:id請求。有了PUT,你應該找回你放入的東西。所以我們假設用戶已經登錄了500次。爲了避免違反REST,這是否意味着我的PUT數據應該包括 accessLogs數組及其所有項目?

我想請求處理程序可以只更新除accessLogs外的所有內容。

回答

4

在最嚴格的定義PUT應該確實取代該對象的內容。如果要用部分數據/指令更新現有對象,請改爲you should use the PATCH method。這將允許你指定你想添加accessLogs(或者讓它們保持不變),而不必發送整個對象 - 只需要指示什麼需要更新。

0

在你的情況下,accessLogs是一個生成的只讀屬性,因此它不必是你的PUT請求的一部分。您也不會發送_id屬性,如果某些屬性具有默認值,則不需要發送這些屬性。

PUT方法要求封閉實體存儲在 提供的Request-URI下。如果Request-URI引用已存在的 資源,則封閉實體應該被認爲是原始服務器上駐留的實體的修改版本 。

的PUT和PATCH請求之間的差異被反映在 方式服務器處理封閉實體來修改由Request-URI所標識的資源 。在PUT請求中,封閉實體 被認爲是存儲在原始服務器上的資源的修改版本,並且客戶端請求替換存儲的版本爲 。但是,對於PATCH,封閉的實體包含一組說明原始服務器上的資源應該如何修改以生成新版本的指令集 。 PATCH 方法影響由Request-URI標識的資源,並且它也可能對其他資源產生副作用;即通過應用PATCH可以創建新的資源,或創建新的資源,或者修改現有的新資源。

你可以找到一個類似的問題here