我希望用户只能报告一次文件/视频。通过将用户 ID 推送到一个数组,然后检查用户是否已经报告了该文件。 到目前为止,我能够找到当前用户,然后是 VideoID,递增 1,然后将其推送到 reportedBy 数组。但是在检查当前用户是否已经报告该文件时,我很迷茫。任何提示/帮助将不胜感激! :-)
我的路线
router.get('/report/:videoLink', function(req, res, next){
async.waterfall([
function(callback){
User.findOne({_id: req.user._id}, function(err, foundUser){
if(err) return next(err)
callback(err, foundUser)
})
},
function(foundUser, callback){
Video.findOne({videoLink: req.params.videoLink}, function(err, reportVideo){
reportVideo.reports++;
reportVideo.reportedBy.push(foundUser);
if (reportVideo.reports > 4) {
reportVideo.remove();
}
reportVideo.save(function(err){
if(err) return next();
});
res.redirect('/');
});
}
]);
});
我的架构
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var random = require('mongoose-simple-random');
var fragSchema = new Schema({
title: String,
videoLink: {type: String, unique: true, required: true},
category: String,
upVotes: {type: Number, default: 0},
downVotes: {type: Number, default: 0},
voted: {type: Boolean, default: false},
reports: {type: Number, default: 0},
reportedBy: [{ type: Schema.Types.ObjectId, ref: 'User'}],
ownByUser: {type: Schema.Types.ObjectId, ref: 'User'},
date: { type: Date, default: Date.now }
});
fragSchema.plugin(random);
module.exports = mongoose.model('Frag', fragSchema);
最佳答案
只有在该用户之前报告过该视频时,这才会找到该视频:
Video.findOne({
videoLink: req.params.videoLink,
reportedBy: foundUser._id,
}, ...
只有在之前没有被报道过的情况下,这才会找到视频:
Video.findOne({
videoLink: req.params.videoLink,
reportedBy: {$nin: [foundUser._id]},
}, ...
有很多方法可以实现这一目标,但您明白了。
如果你无论如何都想找到视频然后测试它是否已经被该用户报告然后在你的 Video.findOne
回调中做这样的事情:
if (reportVideo.reportedBy.indexOf(foundUser._id) < 0) {
// not reported by that user yet
} else {
// already reported by that user
}
如果你正在使用 lodash
那么你可以使用:
if (_.includes(reportVideo.reportedBy, foundUser._id)) {
// already reported by that user
} else {
// not reported by that user yet
}
确保您的 ID 为字符串,在比较之前您可能需要使用 .toString()
或类似的东西。
关于arrays - NodeJS/MongoDB - 将数组中的值与登录用户的值进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41303488/