arrays - NodeJS/MongoDB - 将数组中的值与登录用户的值进行匹配

标签 arrays node.js mongodb

我希望用户只能报告一次文件/视频。通过将用户 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/

相关文章:

javascript - 如何使用 Node JS 打印整个 mongoDB 集合

node.js - 在nodejs中使用Writable Stream指定写入文件的位置

javascript - Sequelize Join 与匹配 id 的计数

javascript - Mongoose.js 在数据库中查找昨天的日期

mysql - 什么是存储对象更改历史的好解决方案?

mongodb - 如何使用官方Go驱动程序在MongoDB中持久存储文件(小于16MB)

javascript - 将 React 状态值与 HTML 标签连接起来

javascript - 获取值大于 x 的数组中第一个元素的索引

python - 从数据帧创建数组,以一列值作为引用

c - C 中是否有查找子字符串重叠的函数?