【问题标题】:How to create a document that includes an array of ObjectIds of another collection (best-practice, RESTful)?如何创建一个包含另一个集合的 ObjectId 数组的文档(最佳实践,RESTful)?
【发布时间】:2019-10-22 05:19:58
【问题描述】:

使用MongooseRESTful API 我想要2 个集合(organizationsprojects),而前者的Schema 应该包含projects 类型的[ObjectId] 字段,它引用了后者的文件 - 反之亦然。 创建一个新组织 (POST /organizations) 可以 (a) 将 projects 字段留空并稍后添加项目文档 (POST /projects) 或 (b) 已经使用它创建一些项目。

(b)的问题:

  1. 好像和 RESTful 有冲突,因为发布了一个 新组织应该有不同的 API 点而不是发布一个 新项目 - 但我们希望一次性实现。

  2. 当我们创建一个新组织时,projects 字段应该包含一个数组 引用相应项目的 ObjectIds - 但这些 还没有 ID。

可能有很多方法可以实现目标 - 即 2 个连续的 POST 请求:首先是项目,然后是组织。 但我想了解此场景的最佳实践。

组织架构:

{
    name: { type: String, required: true },
    address: { type: String },
    // projects = array of ObjectIds referring to Project documents
    projects: { type: [Mongoose.Schema.Types.ObjectId] }
}

项目架构:

{
    name: { type: String, required: true },
    start: { type: Date },
    end: { type: Date },
    organization: { type: Mongoose.Schema.Types.ObjectId }
}

所提供的问题描述和代码是大型项目的简化示例,该项目将有许多模型/集合和大量交叉引用。

可以将项目作为组织文档的子文档数组,但我更希望将项目作为独立集合,因为应该可以请求整个集合以获取项目视图,而无需浏览组织文件。

【问题讨论】:

    标签: mongodb rest mongoose mongoose-schema


    【解决方案1】:

    好的,所以我在另一个 post 中找到了一些好主意(这是关于发布相同资源类型的多个项目 - 而不是发布一个项目,其中包含另一个不同资源类型的项目):

    @RESTful:

    资源不需要映射到您的数据库或应用模型

    所以,基本上我可以将“组织”视为可以包含项目并执行 POST 请求 /organizations 的资源,在服务器端我为项目集合创建一个新文档,然后为组织创建一个新文档集合(项目文档的 ObjectId 被推送到字段projects)。

    问题在于响应,当更新数据库出现问题时:响应应该包含有关哪个文档创建失败的信息。

    或者,只要在表单中填写姓名和地址,就可以发送 POST 请求 /organizations。这将导致将组织添加到数据库的组织集合中。然后,如果在同一个表单中添加了一个项目,我们会执行另一个 POST 请求 /projects 传递新创建的组织 ID。服务端我们新建一个项目文档,然后将其 id 推送到组织文档的 projects 数组中。

    【讨论】:

      猜你喜欢
      • 2018-05-05
      • 2017-04-23
      • 1970-01-01
      • 2012-03-23
      • 2019-09-03
      • 1970-01-01
      • 2021-06-10
      • 2020-03-07
      • 2021-04-04
      相关资源
      最近更新 更多