Würde erwägen, den Vorgang in überschaubare Teile zu zerlegen. In diesem Fall möchten Sie die showTakenSeats
aktualisieren Feld mit den Ticketpositionsdaten aus der neuen Bestellung.
Erstens müssen Sie mit async await mit Ihrer Expressroute die Bestellung speichern und das erstellte Bestelldokument abrufen. Erstellen Sie ein Dokument mit den neu eingenommenen Plätzen und aktualisieren Sie dann das Ausstellungsdokument mit findByIdAndUpdate
Methode.
Das folgende Beispiel beschreibt das Obige:
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);
}
});