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