For循环接受数组中的第一个对象,而忽略其他对象

时间:2019-05-07 18:19:42

标签: arrays node.js string mongodb for-loop

我创建了一个For循环,用于为数据库中的用户分配值。 我的代码包括:-

一个名为 Output 的数组,类似于这样;

{['Number': '907384719', 'amount': 23], ['Number': '907118281', 'amount': 50]}

然后,我创建了一个for循环,用于从 output 数组中提取 number amount 值;

var getLength = output.length;
    for (var i = 0; i < output.length; i++) {
        numbers = output[i].number;
        amount1 = output[i].amount;
}

在我的应用中,我对用户的数据集合进行了查询,以提取其ID列在上述 output 数组中的用户ID。

var query = { number: numbers };
        db.collection("accounts").find(query).toArray(function(err, result, from, to) {
        if (err) throw err;
        for (i = 0; i < result.length; i++) {

            id = result[i]._id;

获取用户ID后,我想使用 输出数组中列出的金额值;

 balance.findOneAndUpdate({
                userId: getObjectId(id)
            }, {
                $inc: {
                    balance: parseInt(amount1)
                }
            }, async function(err, res) {
                if (err) {
                    return callback(err)
                } else {
                    callback(null, res.value.balance)
                }
            });

写完此代码后, 我遇到了问题 。该脚本会增加所选用户的余额,但是会以错误的 amount 值来递增。

for循环仅使用输出数组中的第一个“ 金额”值来增加余额。例如,通过使用上述数组,脚本将每个用户的余额增加23点。

我尝试了很多事情,但是似乎有些东西阻塞了我的For Loop。这是完整的代码,我包括一些注释以解释更多信息;

exports.findUser = function(newData, e, callback) {

    // get the number and the amoount attached 

    var output = {
        ['Number': '907384719', 'amount': 23],
        ['Number': '907118281', 'amount': 50]
    }

    var getLength = output.length;
    for (var i = 0; i < output.length; i++) {
        numbers = output[i].number;
        amount1 = output[i].amount;

        //console.log(numbers); These two consoles seem to output the right data
        //console.log(amount1);


        var query = {
            number: numbers
        };
        db.collection("accounts").find(query).toArray(function(err, result, from, to) {
            if (err) throw err;
            for (i = 0; i < result.length; i++) {
                // gets the IDs of the users with their numbers are in the "output array"
                id = result[i]._id;
                //var amount = 500;

                balance.findOneAndUpdate({
                    userId: getObjectId(id)
                }, {
                    $inc: {
                        balance: parseInt(amount1) // only increments with 23 points 
                    }
                }, async function(err, res) {
                    if (err) {
                        return callback(err)
                    } else {
                        callback(null, res.value.balance)
                    }
                });


                //console.log(id);
                //console.log(numbers); outputs only he first number
                //console.log(amount1); outputs only the first amount "23"
            }

        });

    }
}

我的脚本正在获取增加点数的正确帐户,但是它仅以数组中的第一个“金额”值增加。因此,请帮助我了解如何从output数组中增加每个余额的余额。

1 个答案:

答案 0 :(得分:0)

在两个for循环(变量i)中都使用相同的for var,您需要更改第二个变量,以便遍历所有数组:

db.collection("accounts").find(query).toArray(function(err, result, from, to) {
            if (err) throw err;
            for (var j = 0; j < result.length; j++) {
             //rest of your code