如何创建一个包含另一个集合的 ObjectId 数组的文档(最佳实践,RESTful)?

Posted

技术标签:

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

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

(b)的问题:

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

    当我们创建一个新组织时,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 

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

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

【问题讨论】:

【参考方案1】:

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

@RESTful:

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

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

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

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

【讨论】:

以上是关于如何创建一个包含另一个集合的 ObjectId 数组的文档(最佳实践,RESTful)?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 存储另一个集合的 ObjectId 的引用

将数组元素与另一个数组合并,该数组是 mongo 集合的一部分

如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?

如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?

创建一个引用集合的 ObjectId 的文档

如何使用存储库接口在 Spring Data 中通过其嵌套对象的 objectId 查找集合?