Javascript 为什么这些查找和更新mongo db调用不能按正确的顺序工作?
我正在开发一个函数,该函数从excel表格中获取学生数据,并根据学生行中的数据将学生分配给学生组 我很难把所有输入的学生都累加起来,相反,如果我输入一批三个学生,它似乎只写最后一个或两个学生 在我看来,有三个步骤:我需要找到一个组的当前学生列表,然后将新学生添加到该列表中,最后用旧学生和新学生的组合更新组列表 我认为一定发生了种族错误,因为“找到的学生”总是以空列表的形式记录控制台日志,所以我认为更新部分没有按照正确的顺序进行 以下是我第一次尝试的方法,它给了我所描述的不期望的结果:Javascript 为什么这些查找和更新mongo db调用不能按正确的顺序工作?,javascript,mongodb,Javascript,Mongodb,我正在开发一个函数,该函数从excel表格中获取学生数据,并根据学生行中的数据将学生分配给学生组 我很难把所有输入的学生都累加起来,相反,如果我输入一批三个学生,它似乎只写最后一个或两个学生 在我看来,有三个步骤:我需要找到一个组的当前学生列表,然后将新学生添加到该列表中,最后用旧学生和新学生的组合更新组列表 我认为一定发生了种族错误,因为“找到的学生”总是以空列表的形式记录控制台日志,所以我认为更新部分没有按照正确的顺序进行 以下是我第一次尝试的方法,它给了我所描述的不期望的结果: globa
global.db.collection("groups").find({userId: user_id.toString(), groupNumber:parseInt(realGroupNumber)}).toArray( function (err, group) {
if(err) {console.log(err)};
if(group[0]) {
//Add student to group's student list...
group[0].students.push(NewRow[realRowNumber]);
//Update group with new student list...
global.db.collection("groups").updateOne({userId: user_id.toString(), groupNumber:parseInt(realGroupNumber)}, {$set: group[0]}, {upsert: true}, function (err, group) {
if(err) {console.log(err)};
});
};
});
然后,我尝试使用回调函数来避免争用错误,但得到了相同的结果:
function findStudentList(param, callback) {
//Find group matching group number, user id
global.db.collection("groups").find({userId: user_id.toString(), groupNumber:parseInt(param)}).toArray( function (err, group) {
if(err) {console.log(err)};
if(group[0]) {
callback(group[0]);
};
});
};
function updateStudentList(oldGroupInfo) {
newStudent = NewRow[realRowNumber]
oldGroupInfo.students.push(newStudent)
// db.update with new list here
global.db.collection("groups").updateOne({userId: user_id.toString(), groupNumber:parseInt(realGroupNumber)}, {$set: oldGroupInfo}, {upsert: true}, function (err, group) {
if(err) {console.log(err)};
});
};
findStudentList(realGroupNumber, updateStudentList)
有什么想法吗?这是一个for循环,每个新生调用一次。它的行为就像以前从未发生过对学生名单的更新。。。查找调用每次都会显示一个空的学生列表,而不是添加和累积学生。尽管我已经把所有的事情都记录下来了,而且数据都放在了正确的地方,只是更新不正确。再次,只有最后一名学生或最后两名学生成功进入小组
非常感谢您的帮助!谢谢 你能分享数据吗?好的,我想我知道怎么回事了。写入数据的第二个数据库调用将触发,但for循环不会等待此调用完成,然后继续在循环上启动。因此,当它在第二个上再次找到数据时,它会找到一个空列表。有没有人有一个简单的解决方案可以让for循环等待第二次调用完成?我将尝试一个在第二次调用结束后调用自身的递归解决方案。好的,递归解决方案成功了!:“”())