Node.js 在mongoose(nodejs)中获取随机筛选值

Node.js 在mongoose(nodejs)中获取随机筛选值,node.js,mongodb,mongoose,push,Node.js,Mongodb,Mongoose,Push,我正在编写一个简单的应用程序来保存问题列表以生成随机考试。我定义了以下模式: 问题模式: var questionSchema = mongoose.Schema({ text: String, type: { type: String, enum: ['multichoice', 'numerical', 'truefalse'] }, meta: { votes: { type: Number, default: 0 }

我正在编写一个简单的应用程序来保存问题列表以生成随机考试。我定义了以下模式:

问题模式:

var questionSchema = mongoose.Schema({
  text: String,
  type: {
    type: String,
    enum: ['multichoice', 'numerical', 'truefalse']
  },
  meta: {
    votes: {
      type: Number,
      default: 0
    },
    tags: [{
      type: mongoose.Schema.Types.ObjectId,
      ref: 'tag'
    }]
  }
});
标记架构:

var tagSchema = mongoose.Schema({
  name: {
    type: String,
    unique: true
  }
});
我想做的是通过标签过滤随机问题(我使用mongoose random),问题就在这里。我的get route接收逗号分隔的标记名列表。如何筛选有关是否包含该标记名的问题?目前,问题只有一个标签ID列表,我看不出有什么方法可以做到这一点

此时,这是用于获取随机问题的代码:

Question.findRandom().limit(req.query.maxquestions).exec(function (err, questions) {
    if (err) {
        res.send(err);
    } else {
        res.set('Content-Type', 'text/json');
        res.json(questions);
    }
});
编辑:这是我解决问题的实际代码

router.get('/exam', function(req, res) {
  var tags = req.query.tags.split(",");
  var tagsIds;
  var tagsProcessed = 0;

  var eventEmitter = new events.EventEmitter();
  eventEmitter.on('tagProcessed', function() {
    tagsProcessed++;

    if (tagsProcessed >= tags.length) {
      switch (req.query.format) {
        case "json":
        case "xml":
          break;
        case "html":
        default:
          if (req.isAuthenticated()) {
            console.log(tagsIds);
            Question.findRandom({'meta.$.tags': {$in: tagsIds}}).limit(req.query.questions).exec(function (err, questions) {
              if (err) {
                res.send(err);
              } else {
                res.set('Content-Type', 'text/html');
                res.render('exam', {
                  title: 'Smarty',
                  user: req.user,
                  questions: questions,

                });
              }
            });
          } else {
            res.redirect('/');
          }
      }
    }
  });

  if (tags.length > 0) {

    for (var i = 0; i < tags.length; i++) {
      Tag.find({name: tags[i]}, function(err, tag) {
        tagsIds.push(tag);
        eventEmitter.emit('tagProcessed');
      });
    }
  } else {
    eventEmitter.emit('tagProcessed');
  }
});
但是我得到了相同的结果,一个只显示{}(没有消息)的错误

编辑2: 我的标签ID列表中有一个问题。我还将过滤器更改为{'meta.tags':{$in:tagsIds}},现在可以使用了,但我有一个小问题。如果我有一个关于标记foo和bar的问题,并且我发送了一个带有标记foo的get请求,那么这个问题不会被返回。我怎样才能解决这个问题

编辑3:
我在保存错误的值。建议的解决方案(通过修改过滤器)有效。

以下是我建议您采用的方法。首先用从路线中获得的
标签名
查找所有
标签。获取所有标签名的
ID
。下一步是查找标记ID与之关联的所有随机问题

Question.findRandom({tags: {$in: TAG_IDS}}).limit(req.query.maxquestions).exec(function (err, questions) {

});

这就是你所需要做的。

我已经有了所有的te标签ID,但是,我如何过滤这些问题?如何在收到的标签列表中找到至少有一个标签作为参数的问题?我仍然需要尝试,但还是有意义的。这是一个很好的答案,我会接受后,它的工作。非常感谢您的帮助。现在正在工作,但筛选器未按预期工作。我编辑了我的答案。你能看一下吗?
Question.findRandom({tags: {$in: TAG_IDS}}).limit(req.query.maxquestions).exec(function (err, questions) {

});