2014-10-04 50 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