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: 我正在保存不良的值。提出的解决方案(使用过滤器修改)可以工作。
我已经拥有所有te标签ID,但是,我怎样才能过滤这些问题?如何在leas标签列表中找到作为参数收到的标签的问题? – 2014-10-04 17:30:25
我已经更新了我的答案。检查并更新。 – 2014-10-04 18:10:52
我仍然必须尝试它,但有道理。这是一个很好的答案,我会在工作后接受它。比你非常感谢你的帮助。 – 2014-10-04 18:20:42