Как хранить метод, пока массив не имеет 2 элемента в mongodb - PullRequest
1 голос
/ 04 июня 2019

Я хочу удерживать метод до тех пор, пока в массиве не будет 2 или более элементов, использующих nodejs и mongodb ..

exports.Arrayelements = function(req, res) {
    var elementName = req.body.elementName;
    connection.arrayelements.updateMany({}, { $push: { sampleArray: [elementName] } }, { upsert: true });
    connection.arrayelements.find({}, function(err, docs) {
        if(err) throw err;
        if(docs[0].elementName.length >= 2) {
            // call this function
        } else {
            // want to call back again to push syntax until 2 or more elements in array
        }
    });
}

1 Ответ

0 голосов
/ 04 июня 2019

Прежде всего find возвращает курсор, а если вам нужен только первый документ (docs [0]), это либо connection.arrayelements.findOne({}), либо connection.arrayelements.find({}).next().

Следующая проблема: updateMany и next принимают ответные вызовы или возвращают обещания.Вы не используете обещание, возвращенное updateMany в своем фрагменте, и это ошибка.Ваше заявление о поиске может вернуть результаты до того, как произошло обновление, в зависимости от условий гонки.

Наконец, использование setInterval весьма опрометчиво.Если вам нужно повторять операторы updateMany в цикле, пока результат поиска не будет соответствовать вашим критериям - просто сделайте это.С синтаксисом async / await это так просто:

exports.Arrayelements = async function(req, res) {
    const elementName = req.body.elementName;
    do {
        await connection.arrayelements.updateMany({}, { $push: { sampleArray: [elementName] } }, { upsert: true });
        const doc = await connection.arrayelements.findOne({});
    } while(doc.elementName.length >= 2);
    // call this function
}
...