我有一个使用Node.js, Mongoose, MongoDB和MongoDB Compass的博客应用程序。我的目标是计算每个帖子有多少浏览量。为此,我创建了一个Post模型模式,当然还有一个到Post的路径。我还发现有一个$inc方法来增加数据库中的值。https://medium.com/@salonimalhotra1ind -如何增量- -数量-价值-在猫鼬- 785066 ba09d8
我的问题是,我想增加默认的0值,但由于某种原因,当我检查值仍然是0。
这一定是很简单的事情。我尝试了几种不同的方法,但仍然没有计数。对于这件事的任何想法都是非常感激的!谢谢你!
这是带有'viewCount'的模式:
const {Schema, model} = require('mongoose');
const UrlSlugs = require('mongoose-url-slugs');
const PostSchema = new Schema({
user: {
type: Schema.Types.ObjectId,
ref: 'users'
},
category: {
type: Schema.Types.ObjectId,
ref: 'categories'
},
title: {
type: String,
require: true
},
slug: {
type: String
},
status: {
type: String,
default: 'public'
},
allowComments: {
type: Boolean,
require: true
},
body: {
type: String,
require: true
},
file: {
type: String
},
date: {
type: Date,
default: Date.now()
},
dateToApply: {
type: Date
},
viewCount: {
type: Number,
default: 0
},
comments: [{
type: Schema.Types.ObjectId,
ref: 'comments'
}]
}, {usePushEach: true});
PostSchema.plugin(UrlSlugs('title', {field: 'slug'}));
try {
module.exports = model('posts', PostSchema);
} catch (e) {
module.exports = model('posts');
}
和指向$inc:
帖子的路由router.get('/post/:slug',(req, res) => {
Post.findOneAndUpdate({slug : req.params.slug}, {$inc : {viewCount : 1}});
Post.findOne({slug: req.params.slug})
.populate({path: 'comments', populate: {path: 'user', model: 'users'}})
.populate('user')
.then(post => {
return Category.find({})
.then(categories => {
res.render('home/post', {post: post, categories: categories});
});
});
});
看起来问题是因为findOneAndUpdate
是一个异步函数,这意味着您对findOne
的下一次调用将在更新完成之前运行。
你要么需要调用.then(() => Post.findOne(...
之后,你的findOneAndUpdate
调用等待结果,或者更好的只是使用{new: true}
标志在findOneAndUpdate
,像这样:
router.get('/post/:slug',(req, res) => {
Post.findOneAndUpdate({slug : req.params.slug}, {$inc : {viewCount : 1}}, {new: true})
.populate({path: 'comments', populate: {path: 'user', model: 'users'}})
.populate('user')
.then(post => {
return Category.find({})
.then(categories => {
res.render('home/post', {post: post, categories: categories});
});
});
});