【问题标题】:Embedding collections (subdocument arrays) with MongoDB violates REST?用 MongoDB 嵌入集合(子文档数组)违反 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 之外的所有内容。

【问题讨论】:

    标签: mongodb rest subdocument


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      你可以找到类似的问题here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多