如何使用 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