我正在创建一个用户可以在其中共享文章的应用程序。
目前,当 auser
共享一个时article
,它会将article
共享项的 ID 添加到在 上调用的数组shares
中user
。
var userSchema = {
// `sharedItems` is a list of article IDs that the user has shared
sharedItems: { type: Array }
};
但是,因为我需要一种方法来查询多个用户 ID 的共享项目(类似于新闻提要类型的查询),所以我决定走这条路线,为共享项目创建一个单独的集合。
var shareSchema = {
// The ID of the user who shared the article
userId: { type: String },
// The ID of the article shared
articleId: { type: String },
dateCreated: { type: Date }
};
为了在我的应用程序代码中将其绑定在一起,当 auser
更新时,会检查sharedItems
上的数组是否user
已更新——如果是,则将任务委派给shares
集合以分别添加或删除任何匹配项。我这样做是因为,当用户共享一个项目时,我的客户端应用程序只需要担心POST
向资源发出请求user
,而不是POST
向user
和 share
资源发出请求。这里的问题是我依赖于复制,我担心由于各种原因,可能会有一些不准确之处。
实体上需要sharedItems
数组user
是因为,当加载任何文章时,我的应用程序必须检测登录用户共享了哪些项目。我的应用程序解析每个加载的响应,article
并检查当前是否在其数组中user
具有该article
ID sharedItems
- 如果有,它会isShared
在文章中添加一个属性。
实现所有这些的唯一另一种选择——我能想到的——是sharedItems
从用户模式中删除数组,并向我的 API 添加某种身份验证,以便GET
对资源的请求article
将知道当前是谁user 是,因此,我的后端可以担心检查当前用户是否已共享article
响应中发送的内容,而不是在客户端进行解析。
我遇到的问题是我不希望我的 API 需要身份验证。GET
所有用户,登录或退出(在article
资源上)都应该可以访问文章。但是,我只希望登录用户能够共享文章(POST
到share
资源,或当前POST
到user
委托创建/删除共享文档的资源)。
您将如何处理 MongoDB 集合和模式方面的问题?