如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和

Posted

技术标签:

【中文标题】如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和【英文标题】:How to count overall post activity(likes, dislikes, comment) from postModel and reference sum of those in userModel using mongodb and mongoose 【发布时间】:2020-04-13 10:51:55 【问题描述】:

我使用 MERN Stack 来创建社交网络,我需要对整个用户的帖子活动(喜欢、评论、不喜欢)实施计数,并能够在通过 REST API 获取该总和时在 Profile 中访问该总和。

目标是实现评分系统,下一次计算将定义分数(喜欢+评论-不喜欢=分数)。

后模型代码:

const Schema = mongoose.Schema;

const PostSchema = new Schema(

    user:  //we want post to be connected to the user
        type: Schema.Types.ObjectId,
        ref: 'users',
    ,
    text: 
        type: String,
        required: true
    ,
    name:  //name of user to keep posts even if the user delets the account
        type: String
    ,
    avatar: 
        type: String
    ,
    likes: [
        user: 
            type: Schema.Types.ObjectId,
            ref: 'users'
        
    ],
    dislikes: [
        user: 
            type: Schema.Types.ObjectId,
            ref: 'users'
        
    ],

    comments: [
        user: 
            type: Schema.Types.ObjectId,
            ref: 'users'
        ,
        text: 
            type: String,
            required: true
        ,
        name:  //name of user to keep comments even if the user delets the account
            type: String
        ,
        avatar: 
            type: String
        ,
        date: 
            type: Date,
            default: Date.now
        
    ],

    date: 
        type: Date,
        default: Date.now
    
)

module.exports = Post = mongoose.model('post', PostSchema);

个人资料代码

const mongoose = require('mongoose');

const ProfileSchema = new mongoose.Schema(
    user: 
        type: mongoose.Schema.Types.ObjectId, //every profile is associated with user, so connect with user.id
        ref: 'user' //reference to user model
    ,
    website: 
        type: String
    ,
    location: 
        type: String
    ,
    bio: 
        type: String
    ,
    activity_count: 
        type: Number,
        ref: 'post'
    ,

    social: 
        youtube: 
            type: String
        ,
        twitter: 
            type: String
        ,
        facebook: 
            type: String
        ,
        linkedin: 
            type: String
        ,
        instagram: 
            type: String
        
    ,
    date: 
        type: Date,
        default: Date.now
    
);

module.exports = Profile = mongoose.model('profile', ProfileSchema)

【问题讨论】:

请在jsoneditoronline.org分享您想要的输入和输出 【参考方案1】:

如果这是一个 sql 数据库,那么在数据库端实现一些计算每个用户得分的查询是有意义的。

但是对于 mongodb,您必须采用不同的方法。一般来说,在数据库端进行任何类型的计算都是非常低效的。 Mongodb 服务器将所有相关的 BSON 文档转换为 javascript 对象,然后使用相对较慢的 javascript 进行计算。

您应该将分数以及喜欢、评论和不喜欢的次数存储在帖子文档中,而不是计算每个请求的分数。

还要记住,在 MongoDB(NoSQL) 中,非规范化并不是一件坏事。 如果您需要对每个数据库请求进行一些计算,则可以将计算的数据存储在新字段中。

例如,当有人添加评论时,您可能会这样做:

Post.findOneAndUpdate( _id:postId ,  $push:  comments: newComment )

现在只需将其更改为

Post.findOneAndUpdate( _id:postId ,  $push:  comments: newComment ,  $inc:  commentCount: 1, score: 1   )

当有人删除帖子时

Post.findOneAndUpdate( _id:postId ,  $pull:  'comments.id': commentId ,  $inc:  commentCount: -1, score: -1   )

现在所有这些请求都非常快,因为这些更新都是在 BSON 中处理的。您可以将相同的逻辑应用于您的配置文件。

【讨论】:

以上是关于如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongoose 从 mongoDB 中获取一定数量的对象? (Node.js)

如何使用 mongoose 从 mongodb 模式中删除索引?

如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和

如何在 mongodb 和 mongoose 模型中使用 cloudinary

如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)

如何将 MongoDB 查询从 Node.js 驱动程序格式调整为 Mongoose 格式