2014-10-04 3 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 
    } 
}); 

(내가 사용 몽구스 랜덤) 태그로 필터링하고 여기에 문제가 있습니다. 내 get 라우트는 쉼표로 구분 된 태그 이름 목록을받습니다. 해당 태그 이름이 포함되어 있는지 질문에 어떻게 필터링합니까? 현재 질문에는 태그 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로 요청을 보내면이 질문은 반환되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

편집 3 : 잘못된 값을 저장하고있었습니다. 제안 된 솔루션이 필터 수정과 함께 작동합니다.

답변

1

여기 내가 같이 가도록 제안하는 방법이 있습니다. 귀하의 경로에서 오는 tag names으로 먼저 tags을 모두 찾으십시오. 태그 이름이있는 ID's 개를 모두 가져옵니다. 다음은 태그 ID와 연관된 모든 임의의 질문을 찾는 것입니다.

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

}); 

그게 전부입니다.

+0

이미 모든 te 태그 ID가 있지만 질문을 필터링하려면 어떻게해야합니까? 매개 변수로 수신 된 태그 목록의 태그 하나를 사용하여 질문을 찾는 방법은 무엇입니까? –

+0

답변을 업데이트했습니다. 확인하고 업데이트하십시오. –

+0

나는 그것을 시도해야하지만 이해가된다. 그것은 훌륭한 대답이고 나는 그것이 작동하도록 한 후에 그것을 받아 들일 것입니다. 당신보다 훨씬 당신의 도움이 필요합니다. –

관련 문제