2 Обновите методы в одном маршруте, чтобы поменять дату NodeJS, Mongoose + mongoDB - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать маршрут, который принимает 2 даты и поменять эти даты друг с другом в базе данных.

метод обновления работает вне forEach, но не внутри, как я могу получить работу внутридля каждого?

// @route   PATCH api/swap
// @desc    replace date
// @access  Public

router.put("/swap", (req, res) => {
  const firstDate = req.body.firstDate;
  const secondDate = req.body.secondDate;

  // console.log(firstDate, secondDate);

  // Card.updateOne({ date: firstDate }, { $set: { date: secondDate } });
  Card.find()
    .then(cards => {
      cards.forEach(card => {
        if (card.date === firstDate) {
          return card.updateOne(
            { date: firstDate },
            { $set: { date: secondDate } }
          );
        } else if (card.date === secondDate) {
          return card.updateOne(
            { date: secondDate },
            { $set: { date: firstDate } }
          );
        } else {
          return card;
        }
      });
    })
    .then(() => console.log("working"));
});

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Для того, что вы пытаетесь достичь, вам нужно использовать QueryCursor , который позволит вам изменять документы один за другим.

Вы можете сделать что-то вроде этого,

Card.find()
  .cursor()
  .on('data', function(card) { 

      if (card.date === firstDate) {
          card.set("date", secondDate);
      } else if (card.date === secondDate) {
          card.set("date", firstDate);
      }

      card.save(function(err){
      });  
   })
  .on('end', function() { console.log('Done!'); });
0 голосов
/ 13 марта 2019

Необходимо убедиться, что анонимная функция в forEach поддерживает обещания, что может быть достигнуто с помощью ключевого слова async.

Попробуйте это:

      cards.forEach(async (card) => {
          return card.updateOne(
...

Кроме того, findAndModify() может быть лучшим инструментом для работы, так что вы можете избежать перебора всей коллекции Card объектов при каждом запросе и перенести это в параметр query для вызова базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...