【问题标题】:Getting number of likes for a user in all his posts using mongodb使用 mongodb 在用户的所有帖子中获取用户的点赞数
【发布时间】:2020-09-27 16:10:27
【问题描述】:

您好,我想建立一个排行榜,根据用户在所有帖子中累积的点赞数对用户进行排名。

我的帖子数据库

  user: {
    type: Schema.Types.ObjectId,
  },
  text: {
    type: String,
    required: true,
  },
  imageURL: {
    type: [String],
  },
  name: {
    type: String,
    required: true,
  },
  category: {
    type: String,
  },
  likes: [
    {
      user: {
        type: Schema.Types.ObjectId,
      },
    },
  ],
  date: {
    type: Date,
    default: Date.now,
  }

我的用户数据库:


  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  date: {
    type: Date,
    default: Date.now,
  },

我尝试了各种查询和聚合函数,但我无法为此找到正确的解决方案。有没有其他方法可以获取列表。 我想获得一个用户列表和他们在所有帖子中获得的总喜欢。我该怎么做?

【问题讨论】:

    标签: node.js mongodb mongoose social-media-like


    【解决方案1】:

    我最近遇到了同样的情况,我是这样解决的:

    我创建了 3 个不同的模型。用户,帖子,喜欢。 Post 模型将是:

     user: {
        type: Schema.Types.ObjectId,
      },
      text: {
        type: String,
        required: true,
      },
      imageURL: {
        type: [String],
      },
      name: {
        type: String,
        required: true,
      },
      category: {
        type: String,
      },
      date: {
        type: Date,
        default: Date.now,
      }
    

    点赞模式:

    postId: {
      type: Schema.Types.ObjectId,
      required: true
    },
    userId: {
      type: Schema.Types.ObjectId,
      required: true
    },
    likedBy: {
      type: Schema.Types.ObjectId,
      ref: 'User',
      required: true,
    }
    
    1. 在获取帖子时,您可以使用聚合函数并获取帖子as shown here的赞。
    2. 如果您想获取用户收到的点赞数,您可以通过以下方式轻松完成:Like.find({userId}).countDocuments()

    在这种情况下避免使用数组。 因为用户喜欢没有限制。 如果您的应用程序增长,以这种方式管理赞将是一场噩梦。

    【讨论】:

    • 我实际上解决了它,虽然我并不为解决方案感到自豪,但我在配置文件模型中添加了另外 2 个字段,即 numberPosts 和 likes。在喜欢、不喜欢、创建/删除帖子的过程中,我调用了配置文件模型并每次更新。
    • 这很酷,但不要在 Post 模式中使用 likes 作为数组,而是使用单独的 Like 模型。 :)
    • 哈,我试一试。谢谢
    【解决方案2】:

    你可以试试这个查询

    db.collection.aggregate([
      {
        $project: {
          user: 1,
          numberOfLikes: {
            $cond: {
              if: {
                $isArray: "$likes"
              },
              then: {
                $size: "$likes"
              },
              else: "NA"
            }
          }
        }
      }
    ])
    

    你可以找到这个查询的演示here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多