用 MongoDB 嵌入集合(子文档数组)违反 REST?

Posted

技术标签:

【中文标题】用 MongoDB 嵌入集合(子文档数组)违反 REST?【英文标题】:Embedding collections (subdocument arrays) with MongoDB violates REST? 【发布时间】:2015-01-22 16:40:08 【问题描述】:

假设我的 Mongo 数据库中有一个 users 集合:

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

如您所见,一个用户文档可以包含一个访问日志数组。太好了。

但是假设我想更新用户记录并对使用此数据库的 RESTful API 执行 PUT /users/:id 请求。使用 PUT,您应该取回您输入的内容。假设用户已登录 500 次。为了避免违反 REST,这是否意味着我的 PUT 数据应该包含 accessLogs 数组及其所有项目?

我想请求处理程序可以只更新除 accessLogs 之外的所有内容。

【问题讨论】:

【参考方案1】:

在最严格的定义中,PUT 确实应该替换对象的内容。如果您想用部分数据/指令更新现有对象,you should use the PATCH method。这将允许您指定要添加 accessLogs(或以其他方式保持不变)并且不必发送整个对象 - 只需说明需要更新的内容。

【讨论】:

【参考方案2】:

在您的情况下,accessLogs 是生成的只读属性,因此它不必是您的 PUT 请求的一部分。您也不必发送_id 属性,如果某些属性具有默认值,您也不必发送这些属性。

PUT 方法请求将封闭的实体存储在 提供的请求 URI。如果 Request-URI 引用了一个已经存在的 资源,封闭的实体应该被认为是修改过的 驻留在源服务器上的版本。

Hypertext Transfer Protocol - HTTP/1.1

PUT 和 PATCH 请求之间的区别体现在 服务器处理封闭实体以修改资源的方式 由 Request-URI 标识。在 PUT 请求中,包含的实体 被认为是存储在 源服务器,并且客户端请求存储的版本是 更换。然而,对于 PATCH,封闭的实体包含一组 描述资源当前如何驻留在 应修改原始服务器以生成新版本。补丁 方法影响由 Request-URI 标识的资源,并且它也 可能对其他资源产生副作用;即,新资源可能是 通过应用 PATCH 创建或修改现有的。

PATCH Method for HTTP

你可以找到类似的问题here。

【讨论】:

以上是关于用 MongoDB 嵌入集合(子文档数组)违反 REST?的主要内容,如果未能解决你的问题,请参考以下文章

用于嵌入式集合的 MongoDB 首选模式。文档与数组

如何匹配 MongoDB 中的子文档数组?

使用 MongoDB 中的文档属性过滤器获取嵌入数组中的扁平文档数组

使用 Spring Data MongodB 更新嵌入式 mongodb 文档中的数组字段?

如何匹配MongoDB中的子文档数组?

MongoDB 中嵌入文档的数组元素的并发更新