Zvažoval bych rozdělení operace na zvládnutelné kousky. V tomto případě byste chtěli aktualizovat showTakenSeats
pole s údaji o pozicích tiketu z nové objednávky.
Za prvé, pomocí asynchronního čekání s vaší expresní cestou musíte uložit objednávku a získat vytvořený dokument objednávky. Vytvořte dokument s nově získanými místy a poté aktualizujte dokument show pomocí findByIdAndUpdate
metoda.
Výše uvedené popisuje následující příklad:
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);
}
});