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