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