我正在创建一个用户可以共享文章的应用程序。
目前,当user
共享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 }
};
要在我的应用程序代码中将其绑定在一起,当更新user
时,会检查sharedItems
上的user
数组是否已更新 - 如果是,将任务委派给shares
集合以分别添加或删除任何匹配项。我这样做是因为,当用户共享一个项目时,我的客户端应用程序只需要担心向POST
资源发出user
请求,而不是POST
user
和 share
资源。这里的麻烦在于我依赖于复制,我担心由于各种原因,可能存在一些不准确之处。
sharedItems
实体上对user
数组的需求是因为,当加载任何文章时,我的应用程序必须检测已登录用户共享的项目。我的应用程序解析每个加载的article
的响应,并检查当前user
是否在其article
数组中具有sharedItems
ID - 如果是,则添加属性isShared
的文章。
实现所有这一切的唯一另一种选择 - 我能想到的 - 是从用户模式中删除sharedItems
数组,并为我的API添加某种身份验证,以便{{1对GET
资源的请求将知道当前用户是谁,因此,我的后端可能会担心检查当前用户是否已共享发送的article
响应,而不是在客户端进行解析。
我遇到的麻烦是我不希望我的API要求身份验证。所有用户都可以访问文章,登录或注销(article
资源上的GET
)。但是,我只希望登录的用户能够共享文章(article
到POST
资源,或当前share
到POST
资源,该文件委托创建/删除股票文件)。
您将如何处理MongoDB集合和模式?
答案 0 :(得分:0)
如果你担心自己无法让它们保持同步,我就不会费心将sharedItems
保留在userSchema
中。只需让sharedSchema
保持最新状态即可。分享文章似乎不应该是秘密,因此您可以在请求中包含当前用户ID,无需身份验证即可获取文章,并让后端告诉您指定的用户是否共享文章。
如果您想尝试保密共享信息,那么您可以向GET文章API添加可选身份验证,并仅返回有关已通过身份验证的用户的共享信息,但无论身份验证如何,都会返回其余的文章信息。或者,当您请求sharedItems
信息并将其包含在响应中时,您可以从sharedSchema
在后端构建user
数组。
答案 1 :(得分:0)
我建议在shareCount
资源中使用GET /article
字段(以防止未经身份验证的曝光),然后使用可用于GET /user
的{{1}}的异步(并经过身份验证的)API调用在初始加载后将文章标记为共享。
如果您这样做,您的GET /article
资源不需要在幕后进行任何额外的工作,并且每个请求都将获得相同的信息(使用shareCount
)。只有当用户登录时,您的设计才会将任何内容标记为共享。