Javascript 为什么这些查找和更新mongo db调用不能按正确的顺序工作?

Javascript 为什么这些查找和更新mongo db调用不能按正确的顺序工作?,javascript,mongodb,Javascript,Mongodb,我正在开发一个函数,该函数从excel表格中获取学生数据,并根据学生行中的数据将学生分配给学生组 我很难把所有输入的学生都累加起来,相反,如果我输入一批三个学生,它似乎只写最后一个或两个学生 在我看来,有三个步骤:我需要找到一个组的当前学生列表,然后将新学生添加到该列表中,最后用旧学生和新学生的组合更新组列表 我认为一定发生了种族错误,因为“找到的学生”总是以空列表的形式记录控制台日志,所以我认为更新部分没有按照正确的顺序进行 以下是我第一次尝试的方法,它给了我所描述的不期望的结果: globa

我正在开发一个函数,该函数从excel表格中获取学生数据,并根据学生行中的数据将学生分配给学生组

我很难把所有输入的学生都累加起来,相反,如果我输入一批三个学生,它似乎只写最后一个或两个学生

在我看来,有三个步骤:我需要找到一个组的当前学生列表,然后将新学生添加到该列表中,最后用旧学生和新学生的组合更新组列表

我认为一定发生了种族错误,因为“找到的学生”总是以空列表的形式记录控制台日志,所以我认为更新部分没有按照正确的顺序进行

以下是我第一次尝试的方法,它给了我所描述的不期望的结果:

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循环等待第二次调用完成?我将尝试一个在第二次调用结束后调用自身的递归解决方案。好的,递归解决方案成功了!:“”())