для каждого, как сохранить несколько данных в MondoDB - PullRequest
0 голосов
/ 07 января 2019

У меня есть приложение на основе стрипа и стека MERN. Моя проблема в том, что когда я нажимаю конечную точку, чтобы получить обвинения, а затем console.log, в результате я вижу массив обвинений. И это хорошо. Поэтому я решил использовать forEach, чтобы перебрать их и извлечь значение amount. Это работает.

Но ..

router.get('/all', (req, res) => {
    stripe.charges.list({
        limit: 3
    }).then(charges => {
        charges.data.forEach(charge => {
            return newData = new Charge({
                amount: charge.amount,
            })
        });
        newData
            .save()
            .then(charge => {
                res.json(charge)
            })
            .catch(err => console.log(err))
    })
})

Когда я использую forEach для создания записи в MongoDB на основе моей модели, я получаю только одну запись, сохраненную в БД, даже если у меня есть как минимум 3 заряда в массиве. Как мне это исправить?

спасибо

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Соберите обещания, чтобы сохранить каждый новый объект Charge в массиве и выполнить их все с помощью Promise.all().

router.get('/all', (req, res) => {
    stripe.charges.list({
        limit: 3
    }).then(charges => {
        let promises = charges.data.map(charge => {
            let newData = new Charge({ amount: charge.amount })
            return newData.save()
        });
        return Promise.all(promises);
    }).then(result => {
        res.json(result);
    }).catch(err => {
        console.log(err);
        res.error(err);
    });
});

РЕДАКТИРОВАТЬ - эту же идею можно применить к более сложному обещанию, например, к условному сохранению, основанному на другом асинхронном запросе. Это будет выглядеть в общих чертах ...

function maybeSave(newData) {
    return db.find(/*a query based on newData */).then(result => {
        return (result)? Promise.resolve() : newData.save();
    });
}

        // and in the loop gathering promises...
        let promises = charges.data.map(charge => {
            let newData = new Charge({ amount: charge.amount })
            return maybeSave(newData);
        });
0 голосов
/ 07 января 2019
var charges = ['a', 'b', 'c'];

charges.forEach(function(data) {
db.insertMany(data,function(err,result)){
console.log(result)
}

  // SAVE DB
});

Работает для каждой записи в массиве, сохраненном в базе данных

0 голосов
/ 07 января 2019

Вам лучше использовать одну операцию вместо нескольких. Для этого: Model.insertMany метод. https://mongoosejs.com/docs/api.html#model_Model.insertMany

Псевдо-код:

const dataForSaving = charges.data.map((charge) => {
  return {
    amount: charge.amount,
  };
});

Collection.insertMany(dataForSaving, (err, docs) => {
  if (err) {
    throw new Error(err);
  }

  console.log(docs);
});
...