【问题标题】:REST API - Best practice to access embedded resourcesREST API - 访问嵌入式资源的最佳实践
【发布时间】:2015-10-21 22:12:26
【问题描述】:

我们使用 MongoDB 并提供 restful api 来访问资源(不仅仅是集合)。 例如,我有一个设备集合。每个设备文档都有一个嵌入式数组:运营商。这些是运营商的关联类,没有任何唯一 ID

{
   _id: ObjectId("..."),
   carriers: [
     {
         carrier: ObjectId("..."),
         bindingInterval: {
           from: ISODate("..."),
           to: ISODate("...")
         }
     },
     ...
   ]
}

在我们的服务中,载体绑定的唯一性由特定字段的复合决定:载体+从+到值。

问题: 要求这些嵌入式文档的最佳实践是什么?在许多情况下,我分别GET / POST / PUT / DELETE

否则这只是一个例子。我们在许多其他情况下嵌入了文档。

想法:

  1. 我在主资源的 id 下面分别描述查询中的复合参数。
  2. 我使用这些参数的 mixin 为嵌入式文档定义了一个虚拟 id,并将这种方法推广到类似情况。

【问题讨论】:

  • 老实说,如果您需要通过 REST API 查询特定资源,最好的办法是为其分配一个唯一 ID。如果您只需要一个集合过滤,例如通过 from 范围,一些资源查询语言会很有用。
  • 后一种情况已经准备好并完成了,正如您所写的那样具有令人满意的查询语言。在前一种情况下,我认为没有必要添加唯一 ID,因为指定的字段确保了唯一性。
  • 完全同意,但是,引入的ID将使查询更容易。
  • 因此我认为我创建了一个以某种方式混合参数的虚拟 ID,例如简单的连接或 md5,我不存储它,只是用于查询。我在restful tutorials中寻找这个案例,但我没有找到任何关于这个的东西,但是它必须这样做。还是我错了,我在端点结构的设计上犯了错误?为了安全起见,我希望 API 可以单独修改这些文档。这是一个糟糕的设计,我必须一次修改这些吗?我不知道...

标签: mongodb api rest embedded-resource


【解决方案1】:

据我了解,您需要以 RESTful 方式访问未分配任何 ID 的元素。

首先,我只为运营商添加一个单独的端点。它将是:

/devices/{deviceID}/carriers/

我不知道为什么不在 mongo DB 级别分配唯一 ID(这似乎是最简单的选择),但如果不可能,最好通过路径中传递的人工复合键引用给定资源,而不是发送参数分别通过查询字符串。因此,每次返回运营商集合时,都会为每个元素分配一个:

carrierID = md5(carrier+from+to)

使用这样的密钥,您可以通过以下方式轻松引用每个嵌入式资源:

/devices/{deviceID}/carriers/{carrierID}/

似乎通过不同的端点引用这些资源会容易得多。

缺点是您需要重新计算后端所有资源的carrierID,以检查它们是否与收到的资源匹配。

我看到每个运营商字段都有一个ObjectId。它不是独一无二的吗?为什么不用呢?

【讨论】:

  • /devices/{deviceID}/carriers/ 这是端点层次结构中的正确方法。但是 md5 需要在 mongo 端进行聚合,如您所说,必须计算每个 md5 值。 carrierId 在关联类中不是唯一的,因为一个设备可能处于同一运营商的不同间隔中。但我错了,from 值对于查询来说是令人满意的。
  • 因此,如果from 满足唯一性要求,我会将其用作carrierID。如果您不想显式传递它,请使用 md5 或其他哈希 od - 正如我已经写过的那样,它会影响性能。
  • 否则,如果我们有多个唯一性参数,则会出现问题。但!我不是在寻找解决方案。我可以解决它。如果有的话,我需要最漂亮且被普遍接受的解决方案。
  • 我会按照我建议的方式进行。
  • 我想保留这个问题。
猜你喜欢
  • 2020-04-30
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2013-10-23
  • 1970-01-01
相关资源
最近更新 更多