4

我正在创建一个用户可以在其中共享文章的应用程序。

目前,当 auser共享一个时article,它会将article共享项的 ID 添加到在 上调用的数组sharesuser

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,而不是POSTuser share资源发出请求。这里的问题是我依赖于复制,我担心由于各种原因,可能会有一些不准确之处。

实体上需要sharedItems数组user是因为,当加载任何文章时,我的应用程序必须检测登录用户共享了哪些项目。我的应用程序解析每个加载的响应,article并检查当前是否在其数组中user具有该articleID sharedItems- 如果有,它会isShared在文章中添加一个属性。

实现所有这些的唯一另一种选择——我能想到的——是sharedItems从用户模式中删除数组,并向我的 API 添加某种身份验证,以便GET对资源的请求article将知道当前是谁user 是,因此,我的后端可以担心检查当前用户是否已共享article响应中发送的内容,而不是在客户端进行解析。

我遇到的问题是我不希望我的 API 需要身份验证。GET所有用户,登录或退出(在article资源上)都应该可以访问文章。但是,我只希望登录用户能够共享文章(POSTshare资源,或当前POSTuser委托创建/删除共享文档的资源)。

您将如何处理 MongoDB 集合和模式方面的问题?

4

2 回答 2

0

如果您担心无法使它们保持同步,sharedItems我不会费心保留它们。userSchema只需保持sharedSchema最新。分享文章似乎不是秘密,因此您可以在请求中包含当前用户 ID 以获取文章而无需身份验证,并让后端告诉您指定的用户是否分享了文章.

如果您想尝试对共享信息保密,那么您可以将可选身份验证添加到 GET 文章 API,并且仅返回有关经过身份验证的用户的共享信息,但无论身份验证如何,都返回文章的其余信息。或者,您可以在请求信息时sharedItems在后端构建数组并将其包含在响应中。sharedSchemauser

于 2013-05-30T05:09:24.253 回答
0

我建议shareCount在资源中使用一个字段GET /article(以防止未经身份验证的暴露),然后使用异步(和经过身份验证的)API 调用GET /user,您可以在初始加载后将文章标记为共享。

如果您这样做,您的GET /article资源不需要在幕后做任何额外的工作,并且每个请求都将获得相同的信息(带有shareCount)。只有当用户登录时,您的设计才会关心将任何内容标记为共享。

于 2013-05-31T04:41:38.750 回答