MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

kann ein Dokument nicht über 'findById' und save() mit Promise aktualisieren

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