Функция для обмена значениями в NodeJS с mongo mongoose

#javascript #arrays #node.js #mongodb #mongoose

#javascript #массивы #node.js #mongodb #mongoose

Вопрос:

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

консоль печатает, но данные в базе данных не меняются

 // @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"));
});
  

Ответ №1:

Из документации по обновлению Mongo updateOne updateOne принимает 3 аргумента: filter,update,callback, поэтому я считаю, что вам нужно передать _id коллекции для изменения.

Update- find() возвращает курсор и для использования foreach преобразует его в массив с помощью find().toArray().then(..so on)

 // @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.find().toArray().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"));
 });
  

Комментарии:

1. да, у меня это есть, но это все еще не работало, я продолжу и обновлю свой текущий вариант до того, как он у меня был

2. Я использую date в качестве своего уникального ключа, он работает вне foreach, но не внутри, вот в чем моя проблема

3. Я только что попробовал это, к сожалению, тот же результат, если я размещаю Card.updateOne({ date: firstDate }, { $set: { date: secondDate } }); с qoutes и без них оба работают вне функции foreach

4. Итак, в блоке if , который вы проверяете, card.id === firstDate не следует ли вам проверять card.date === firstDate , потому что вы используете date в качестве ur фильтра, у mongo нет id , а _id возвращает ObjectId

5. упс, это на самом деле просто опечатка, спасибо вам за это, но обновление even все еще не работает прямо сейчас