Zou overwegen de operatie op te splitsen in hanteerbare brokken. In dit geval zou je de showTakenSeats
. willen updaten veld met de ticketpositiegegevens van de nieuwe bestelling.
Ten eerste, als u async wait met uw expresroute gebruikt, moet u de bestelling opslaan en het gemaakte besteldocument ophalen. Maak een document met de nieuw ingenomen stoelen en werk vervolgens het showdocument bij met findByIdAndUpdate
methode.
Het volgende voorbeeld beschrijft het bovenstaande:
const express = require('express');
const router = express.Router();
const Order = require('../models/order.js');
const Show = require('../models/show.js');
router.post('/', async (req, res, next) => {
try {
/* create a new Order */
const order = new Order(req.body);
const newOrder = await order.save();
/* create a document to use in the update with the following data structure:
{
'showTakenSeats.6-0': 5b53735ef7ce3d2cd4bbfee7,
'showTakenSeats.6-1': 5b53735ef7ce3d2cd4bbfee7,
'showTakenSeats.6-2': 5b53735ef7ce3d2cd4bbfee7
}
Use the native reduce method on the array to create this
*/
const updatedSeats = newOrder.ticketPositions.reduce((acc, position) => {
acc[`showTakenSeats.${position.join('-')}`] = newOrder._id;
return acc;
}, {});
/* update the show document's embedded showTakenSeats
with the new properties from above
*/
const updateShow = await Show.findByIdAndUpdate(req.body._ShowId,
{ '$set': updatedSeats },
{ 'new': true }
);
res.json(updateShow);
} catch (e) {
/* this will eventually be handled by your error handling middleware */
next(e);
}
});