如何创建一个包含另一个集合的 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 【问题描述】:使用Mongoose
和RESTful API
我想要2 个集合(organizations
和projects
),而前者的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 集合进行分组?