【问题标题】:How can I aggregate a Likes collection to it's Posts collection in MongoDB?如何将 Likes 集合聚合到 MongoDB 中的 Posts 集合?
【发布时间】:2021-11-06 20:13:06
【问题描述】:

场景:我们有一个应用程序,其中包含 Posts 集合和一个 Likes 集合,其中 postId 和 customerId 与之关联。这两个集合的架构定义如下:

// Post Schema 
let postSchema = new Schema({
  user: {type: Schema.Types.ObjectId, ref: "user"},
  text: {type: String},
  likeCount: {type: Number}
)}


// Like Schema
let likeSchema = newSchema({
  post: {type: Schema.Types.ObjectId, ref: "post"},
  user: {type: Schema.Types.ObjectId, ref: "user"},
})

案例:我将获取帖子(带有分页)。但是,我还想发送一个指示符,说明用户是否已经喜欢这篇文章。

问题:

  1. 获取一组带有附加指示符(或新键)的文章的最佳方法是说明现有用户是否喜欢它。 (我将在执行查询时获得 userId)。
  2. 聚合是一个不错的选择吗?如果是,我该如何聚合它?真的对管道感到困惑。
  3. 如果不是聚合,如果用户喜欢或不喜欢帖子,还有什么可能是最好的映射方式?

其他详细信息:我们在服务器端使用 Node.Js,我们将对喜欢的集合编制索引。

【问题讨论】:

  • 你能提供样本数据和你的预期输出吗?

标签: node.js mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:
Users.aggregate([
  {
    $lookup: {
      from: "likes", // likes collection name
      localField: "_id",
      foreignField: "user",
      as: "user",
    },
  },
  {
    $addFields: {
      isLiked: { ifNull: ["$user", false] },
    },
  },
  {
    $skip: pageNumber > 1 ? (pageNumber - 1) * nPerPage : 0,
  },
  {
    $limit: nPerPage,
  },
]);

pageNumber 页数 nPerPage 是每页中的文档数

【讨论】:

  • 嘿,感谢您的回复,但这正是我所期待的。只是为了更详细的说明,帖子中的用户是帖子的作者,而点赞集合中的用户可以是任何客户(包括作者)。如果我有任何客户登录,我将拥有他们的 userId,所以我想拉出帖子(就像你在这里提到的那样),然后检查客户是否喜欢任何帖子。如果是,请将 isLiked 键(就像您添加的一样)发送为 true。
  • 你有收藏给用户吗?
  • 是的,我们还有一个用户集合(保存所有用户的详细信息)。
  • 我更新了我的答案,让我解释一下,我在用户集合中搜索并像用户 ID 一样填充,如果用户键的值为 null,它将添加 isLike 到 false
  • 嗨,很抱歉继续这个,但我不希望有用户列表。我想拉出一个帖子列表。假设我以客户身份登录并想要获取帖子列表,在这种情况下,API 应该返回给我一个帖子列表,并附加一个 isLiked 标志,此标志显示客户之前是否喜欢过该帖子或不是。或者说清楚,如果类似的模式有帖子和客户的用户 ID 的条目。
猜你喜欢
  • 1970-01-01
  • 2018-08-31
  • 2014-05-27
  • 1970-01-01
  • 2013-06-17
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
相关资源
最近更新 更多