在流星中跨集合同步数据

时间:2016-03-13 05:36:49

标签: meteor meteor-blaze

我正在使用meteor来跟踪一个人在测验问题中的进展情况。我想从与当前问题相匹配的测验中返回一个随机问题。我的麻烦在于我有两种方法,一种是创建一个文档来跟踪整个测验的进度,另一种创建一个文档来跟踪特定问题以及与答案匹配的文档。我需要在一个方法调用中设置“questionId”等于另一个方法中的“currentQuestionId”。

我的问题是,在尝试同步我的responseToLectures中的currentquestionId时,问题是它实际选择的问题,在我当前的代码中不能正常工作,因为这些方法是异步的,但我是以同步的方式调用它们。我可以获得有关如何重构此代码以获得更像流星的帮助吗?我注意到有趣的是,如果我把console.logs放在最里面的“if”块中,我会看到它们在页面加载之前被调用了5次,我想我希望它一旦返回就会返回,它将停止运行该块,并在下次加载时,它将立即返回正确的问题。谢谢!

Question: function(){
        var responsesToLectures = ResponsesToLectures.findOne({});
        if (responsesToLectures != null){
            if(responsesToLectures.currentProblemId == null){
                var questionCount = Questions.find({level: responsesToLectures.currentLevel}).count();
                if(questionCount != null){
                    var randomNumber = Math.floor((Math.random() * questionCount));
                    var randomQuestion = Questions.findOne({level: responsesToLectures.currentLevel}, {skip: randomNumber});
                    if (randomQuestion != null) {
                        Meteor.call('setRandomQuestion', randomQuestion._id, randomQuestion.lectureId);
                        return randomQuestion;
                    }
                }
            } else {
                return Questions.findOne({_id : responsesToLectures.currentProblemId});
            }
        }
    },

问题是Question.findOne从我使用'setRandom'问题设置的那个中返回了一个不同的id。从集合中的文档中检索值的正确方法是什么,以便我可以将它们从其他集合中传送到文档中?

这是mongo数据库,向您展示我的意思:

meteor:PRIMARY> db.responses.find();
{ "_id" : "zTTF7GrnuRqT4JNck", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "yHQzekpge486CwqLJ" }
{ "_id" : "47d2hhw7okLq2SXhm", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "WyyKfxzbinjxgrujd"}
{ "_id" : "ZqQu3TDcdMeo2SFBR", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "MES2Aj8PTNzMmthyh"}
{ "_id" : "dHtyKSxDccXvBTjnD", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6", "answerId" : "tPcCSjS8qhL7oebWZ" }
meteor:PRIMARY> db.responsesToLectures.find();
{ "_id" : "TohrY5tHK2DJ2ngWb", "userId" : "hneHgetL9oYaL2iWA", "lectureId" : "pZKuD2LnBh73wPTtN", "currentLevel" : 1, "currentQuestionId" : "FZBQu5wQq2bA2e6SB" }
meteor:PRIMARY> db.scores.find();
{ "_id" : "9HhC8CBG4JJTxcR8m", "userId" : "hneHgetL9oYaL2iWA", "questionId" : "ZSYJXn59ykA9QrTv6" }

1 个答案:

答案 0 :(得分:0)

对于那些在将来遇到此类问题的人,我能够使用集合挂钩在多个集合中同步ID。这对我有用!

ResponsesToLectures.before.insert(function(userId, doc){
    var questionCount = Questions.find({level: doc.currentLevel}).count();
    if(questionCount != null){
        var randomNumber = Math.floor((Math.random() * questionCount));
        var randomQuestion = Questions.findOne({level: doc.currentLevel}, {skip: randomNumber});
        if (randomQuestion != null) {
            doc.currentQuestionId = randomQuestion._id;
        }
    }
});