Цикл for принимает первый объект в массиве и игнорирует другие - PullRequest
0 голосов
/ 07 мая 2019

Я создал цикл For, который присваивает значения пользователям в моей базе данных. Мой код состоит из: -

Массив с именем Output , что-то вроде этого;

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

Затем я создал цикл for, который извлекает число и количество значений из массива output ;

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

В моем приложении я сделал запрос в коллекцию данных пользователя, чтобы извлечь ID пользователей, чьи номера указаны в приведенном выше массиве output .

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;

После получения идентификаторов пользователей я хотел увеличить их баланс с помощью количество значений, перечисленных в массиве output ;

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

После написания этого кода я столкнулся с проблемой . Этот скрипт увеличивает баланс выбранных пользователей, но он увеличивается с неправильными значениями сумму .

Цикл for увеличивает только баланс с первым значением amount в выходном массиве. Например, используя приведенный выше массив, скрипт увеличивает баланс каждого пользователя на 23 балла.

Я много чего пробовал, но, похоже, что-то блокирует мой цикл. Вот полный код, я включил некоторые комментарии, чтобы объяснить больше;

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 голосов
/ 07 мая 2019

Вы используете один и тот же for var в обоих циклах for (var i), вам нужно изменить второй 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...