Uso node.js para construir el backend y conservar los datos en MongoDB. Cuando hago una solicitud de parche, puedo cambiar los valores de todos los campos de otros tipos excepto el de tipo fecha.
Este es el código de back-end para la solicitud de parche.
router.patch('/:id', isLoggedIn, async (req, res) => { try { const updatedBooking = await Booking.updateOne( {_id: req.params.id}, { $set: {userEmail: req.body.userEmail}, $set: {shiftDate: req.body.shiftDate}, $set: {isMorningShift: req.body.isMorningShift} } ); res.json(updatedBooking); } catch (err) { res.send({message: err}); } });Este es el esquema de la base de datos:
const BookingSchema=mongoose.Schema({ userEmail:{ type:String, required:true }, shiftDate:{ type:Date, required:true }, isMorningShift:{ type: Boolean, required: true } });Los objetos en MongoDB se ven así:
{ "_id": "61787183e67b6822180175f9", "userEmail": "admin2@parantion.nl", "isMorningShift": false, "__v": 0, "shiftDate": "2066-06-23T00:00:00.000Z" }¿Cuál podría ser el problema?
En lugar de múltiples $set , actualice todas las claves en una,
const updatedBooking = await Booking.updateOne( {_id: req.params.id}, { $set: { userEmail: req.body.userEmail, shiftDate: new Date(req.body.shiftDate), isMorningShift: req.body.isMorningShift } } );La respuesta de @ fractal397 funcionará bien. Si quieres un código más limpio, puedes usar esto.
const bookingId = req.params.id; const payload = userEmail: req.body.userEmail, shiftDate: new Date(req.body.shiftDate), isMorningShift: req.body.isMorningShift } const booking = await Booking.findByIdAndUpdate(bookingId, payload); PD: después de Mongoose 4.0, el new valor de findByIdAndUpdate se ha cambiado a false de forma predeterminada. Entonces, en esta operación, los datos se actualizarán en la base de datos pero devolverá el valor anterior de booking . Para obtener un valor actualizado en respuesta también, tendrá que hacer:
const booking = await Booking.findByIdAndUpdate(bookingId, payload, { new : true });
Cambiar la línea:
$set: {shiftDate: req.body.shiftDate}a
$set: {shiftDate: new Date(req.body.shiftDate)}o
$set: {shiftDate: new Date()} //for todays date in your local formatEsto funciona: probé esto con express así:
app.get('/updateOne', async (req, res) => { //get data through query params in url const id = req.query.id; const date = req.query.date; //connect to db and collection //1 connect //2 set db and collection const client = await MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true, }); const collection = client.db("sample_airbnb").collection("listingsAndReviews"); //update function for date field try { const updatedBooking = await collection.updateOne( {_id: id}, { $set: {name: new Date(date)} //2066-06-23T00:00:00.000Z } ); res.json(updatedBooking); } catch (err) { res.send({'message': err}); } })Respuesta:
{ "acknowledged": true, "modifiedCount": 1, "upsertedId": null, "upsertedCount": 0, "matchedCount": 1 }Y datos actualizados en Mongoscloud:
_id : "100009690" name : 2066-06-23T00:00:00.000+00:00 Llamé al punto final así: http://localhost:5000/updateOne?id=100009690&date=2066-06-23T00:00:00.000Z y ves que es el mismo formato de fecha que dices que esperas.
¿Puede actualizar su OP y mostrarnos el formato exacto que está pasando? HAGA un console.log(req.body.shiftDate) en la línea 7 justo antes de pasarlo. Sospecho que aquí es donde está el problema.
Obviamente, no debería agregar fechas al campo de nombres, pero esto es solo para una prueba rápida.
Si actualizo varios campos, lo haría con:
//update function try { const updatedBooking = await collection.updateOne( {_id: id}, { $set: { name: name, email: email, lastShift: new Date(date) } } ); res.json(updatedBooking); } catch (err) { res.send({'message': err}); }