#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 возвращает ObjectId5. упс, это на самом деле просто опечатка, спасибо вам за это, но обновление even все еще не работает прямо сейчас