MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

non è possibile aggiornare un documento tramite 'findById' e save() con promessa

Prenderei in considerazione la suddivisione dell'operazione in blocchi gestibili. In questo caso vorresti aggiornare showTakenSeats campo con i dati delle posizioni dei biglietti del nuovo ordine.

In primo luogo, utilizzando async await con il tuo percorso espresso è necessario salvare l'ordine e ottenere il documento dell'ordine creato. Crea un documento con i nuovi posti occupati e quindi aggiorna il documento spettacolo utilizzando findByIdAndUpdate metodo.

L'esempio seguente descrive quanto sopra:

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);
    }
});