2014-11-24 108 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