首页 > 解决方案 > 如何将 Likes 集合聚合到 MongoDB 中的 Posts 集合?

问题描述

场景:我们有一个应用程序,其中包含 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,我们将索引 likes 集合。

标签: node.jsmongodbmongoosemongodb-queryaggregation-framework

解决方案


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 in page nPerPage 是每页中的文档数


推荐阅读