在流星中跨集合同步数据

Synchronizing data across collections in meteor

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

我的问题是,在尝试同步我的 responseToLectures 中的 currentquestionId 时,它实际选择的问题在我当前的代码中并不完全有效,因为这些方法是异步的,但我以同步方式调用它们.我能否获得有关如何重构此代码以使其更像流星的帮助?我注意到有趣的是,如果我将 console.logs 放在最里面的 "if" 块中,我会看到它们在页面加载前被调用 >5 次,我想我希望尽快它得到 returned,它会停止 运行 块,下次加载时,它会立即 return 正确的问题。谢谢!

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

问题是从中得到 returned 的 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" }

对于以后遇到此类问题的人,我能够使用集合挂钩跨多个集合同步 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;
        }
    }
});