如何将本地MongoDB集合的值与常规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
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语句中不会产生错误。它打印两个集合及其密钥。