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

时间:2019-06-06 16:39:12

标签: mongodb rest mongoose mongoose-schema

使用MongooseRESTful API,我想有2个收藏集(organizationsprojects),而前者的Schema应该收藏类型为projects的字段[ObjectId],其中引用了后者的文档,反之亦然。 创建一个新的组织(POST / organizations)可以(a)将projects字段留为空白,以后再添加项目文档(POST / projects),或者(b)已经使用它创建了一些项目。

(b)的问题:

  1. 这似乎与RESTfulness冲突,因为发布了一个 新组织应具有与发布新API不同的API点 新项目-但我们希望一次性实现两者。

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

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

Oranization模式:

{
    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 个答案:

答案 0 :(得分:0)

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

@RESTfulness:

  

资源无需映射到您的数据库或应用程序模型

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

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

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