如何将本地MongoDB集合的值与常规MongoDB集合进行比较?

时间:2015-09-26 18:22:51

标签: mongodb meteor

我要做的是将用户选择的答案(存储在本地MongoDB集合中)与常规声明集合中的答案进行比较。

我已经尝试了各种各样的光标,但我仍然无法让它工作。当前的事件代码如下所示:

Template.question.events({
  "click .button": function(e){
    e.preventDefault;

    var init ="";
    Session.set("userValue", init)
    for (var i = 0; i < document.getElementsByName("choices").length; i++){

      if (document.getElementsByName("choices")[i].checked){
        init = document.getElementsByName("choices")[i].value;
      }
    }

    var id = "";

    Answers.insert({answer: init}, function(error, result){
      if (error){
        console.log("error: " + error);
      } else if (result){
        id = result;
      }

    });


    if(Answers.findOne({_id: id}, {answer: 1}) === Quiz.findOne({_id: this._id},{answer:1})){
      console.log("The answers match.");
    } else{
      console.log("Something went wrong.");
    }
  }

});

所以正在发生的事情是控制台打印出“出错了”,这意味着这两个答案不匹配......当它们完全相同时。所以我必须在最后一个带有集合游标方法调用的if语句中做错了。

“Answers”是本地空的MongoDB集合,而“Quiz”是常规的MongoDB集合。任何帮助将不胜感激。

编辑:我的密钥在数据库中不匹配。我在编码过程中做了一个愚蠢的改变,所以它完全被忽视了。感谢所有人的帮助(特别是Challett)。

1 个答案:

答案 0 :(得分:1)

这个问题正在出现,因为在Mongo中,对象的_id与指定的字段以及javascript处理对象相等的方式一起传递。仅仅因为两个对象具有相同的字段和值并不意味着object1 === object2将返回true。相反,您应该比较您正在查看的字段的值,而不是假设它们不是对象。

要解决此问题,您应该实现以下内容:

var solution = Answers.findOne({_id: id}, {answer: 1}),
    quizSubmission = Quiz.findOne({_id: this._id},{answer:1}));
if(solution.answer === quizSubmission.answer{
          console.log("The answers match.");
    } else {
          console.log("Something went wrong.");
    }

而不是:

if(Answers.findOne({_id: id}, {answer: 1}) === Quiz.findOne({_id: this._id},{answer:1})){
      console.log("The answers match.");
    } else{
      console.log("Something went wrong.");
    }

要解决kyll带来的问题,可以将此代码放在插入的回调中。如果这样做,您需要在调用Answers.insert()

之前将this._id分配给变量

例如:

var currentId = this._id;
Answers.insert({answer: init}, function(error, result){
      if (error){
        console.log("error: " + error);
      } else if (result){
        id = result;
        var solution = Answers.findOne({_id: id}, {answer: 1}),
            quizSubmission = Quiz.findOne({_id: currentId},{answer:1}));
        if(solution.answer === quizSubmission.answer){
            console.log("The answers match.");
        } else {
            console.log("Something went wrong.");
        }
      }

    });