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

如何将本地MongoDB集合的值与常规MongoDB集合的值进行比较?,mongodb,meteor,Mongodb,Meteor,我试图做的是将用户选择的答案(存储在本地MongoDB集合中)与常规声明集合中的答案进行比较 我尝试了几乎所有的光标,但仍然无法让它工作。当前事件代码如下所示: Template.question.events({ "click .button": function(e){ e.preventDefault; var init =""; Session.set("userValue", init) for (var i = 0; i < documen

我试图做的是将用户选择的答案(存储在本地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.");
    }
  }

});
Template.question.events({
“点击按钮”:功能(e){
e、 防止违约;
var init=“”;
Session.set(“userValue”,init)
对于(var i=0;i
所以发生的事情是,控制台打印“出了问题”,这意味着这两个答案不匹配…当它们完全相同时。因此,在最后一个if语句中,我肯定做了一些错误的事情,该语句调用了collection cursor方法

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


编辑:I数据库中的键不匹配。我在编码过程中做了一个愚蠢的改变,所以它完全没有被注意到。感谢大家的帮助(特别是Challett)。

这个问题的出现是因为在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提出的问题,可以将此代码放在insert的回调中。如果执行此操作,则需要在调用
Answers.insert()

例如:

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.");
        }
      }

    });

您当前的实现发生了什么?发生了什么事?控制台中打印的是“出错”消息,而不是“答案匹配”,这与我继续脚本所需的相反。您对回调有一个很好的误解。对
Answers.insert
的回调只有在当前函数完成后才会调用,您可以通过在其
else
块中编写
console.log
来轻松证明这一点。凯尔,我已经尝试将if语句放在对Answers.inset的回调中,但它仍然给出相同的消息。我什么都试过了。我也尝试过使用会话,但仍然遇到相同的问题。是的,以前尝试过,但仍然给出了相同的信息。正如凯尔提到的,你有两个问题。我最新的代码块应该可以解决这两个问题,但仍然可以得到相同的结果。我昨天也尝试了同样的方法,因为id变量在insert回调之外是空的。编辑您的问题,将
console.log(Answers.findOne({uid:id},{answer:1,{uid:0}))
console.log(quick.findOne({uid:currentId},{answer:1,{uid:0}))的输出包含在您的equality if语句中。
将其记录在if语句中不会产生错误。它打印两个集合及其密钥。