2014-10-04 54 views
0

我正在编写一个简单的应用程序来保存问题列表以生成随机检查。我定义了这个模式:在猫鼬(nodejs)中获取随机过滤的值

问题的模式:

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 
    } 
}); 

我试图做的是一些随机的问题(我用猫鼬随机)按标签过滤,这是问题所在。我的获取路线获得逗号分隔标签名称列表。如何过滤关于它们是否包含该标签名称的问题?目前问题只有一个标签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'); 
    } 
}); 

我试图改变滤波器到:

Question.findRandom({'meta.$.tags': {$in: tagsIds}}).limit(req.query.questions).exec(function (err, questions) { 

但我得到相同的结果t,仅显示{}(无消息)的错误。

编辑2: 我的标签ID列表有问题。我还将过滤器更改为{'meta.tags':{$ in:tagsIds}},现在可以工作,但我遇到了一些问题。如果我对标签foo和bar有问题,并且发送带有标签foo的get请求,则不会返回此问题。我怎样才能解决这个问题?

编辑3: 我正在保存不良的值。提出的解决方案(使用过滤器修改)可以工作。

回答

1

这是我建议你去的方式。首先找到tags,然后从您的路线中获得tag names。获取所有标签名称的所有ID's。接下来是找到标签ID与它们关联的所有随机问题。

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

}); 

这就是你需要做的。

+0

我已经拥有所有te标签ID,但是,我怎样才能过滤这些问题?如何在leas标签列表中找到作为参数收到的标签的问题? – 2014-10-04 17:30:25

+0

我已经更新了我的答案。检查并更新。 – 2014-10-04 18:10:52

+0

我仍然必须尝试它,但有道理。这是一个很好的答案,我会在工作后接受它。比你非常感谢你的帮助。 – 2014-10-04 18:20:42