Запрос агрегации с $ match работает в MongoDB Compass, но не в моем Node.js приложение

#javascript #node.js #mongodb

#javascript #node.js #mongodb

Вопрос:

У меня есть Booking модель и Event model. Я пытаюсь запросить и проверить, есть ли какие-либо бронирования, у которых уже есть определенное Event._id и User._id , чтобы остановить создание дубликата бронирования для этого пользователя и события. Запрос агрегации работает в MongoDB compass, однако он выдает мне только пустой массив, когда я пытаюсь выполнить запрос в Node.js приложение

Модели

Бронирование

 const BookingSchema = new Schema({
    amount: {
        type: Number,
        required: 'Please supply a number of people',
    },
    event: {
        type: mongoose.Schema.ObjectId,
        ref: 'Event',
        required: 'Must give an event!',
    },
    booker: {
        type: mongoose.Schema.ObjectId,
        ref: 'User',
        required: 'You must supply the booker!',
    },
    confirmed: {
        type: Boolean,
        default: false,
    },
});
  

Событие

 const eventSchema = new Schema(
    {
        title: {
            type: String,
            trim: true,
            required: 'You must add an event name!',
        },
        description: {
            type: String,
            trim: true,
        },
        slug: String,
        created: {
            type: Date,
            default: Date.now,
        },
        date: {
            type: Date,
            min: Date.now,
            required: 'Please enter a valid event Date!',
        },
        minCapacity: {
            type: Number,
            required: 'Please enter a correct min capacity for your event!',
        },
        maxCapacity: {
            type: Number,
            required: 'Please enter a correct max capacity for your event!',
        },
        price: Number,
        location: {
            type: {
                type: String,
                default: 'Point',
            },
            coordinates: [
                {
                    type: Number,
                    required: 'You must supply coords!',
                },
            ],
            address: {
                type: String,
                required: 'Please enter a valid address!',
            },
        },
        photo: String,
        author: {
            type: Schema.ObjectId,
            ref: 'User',
            required: 'You must supply an author!',
        },
        available: Boolean,

        // attendees: [User], you can do through virtuals
    },
    {
        toJSON: { virtuals: true },
        toObject: { virtuals: true },
    }
);
eventSchema.virtual('bookings', {
    ref: 'Booking', // what model is linked?
    localField: '_id', //what field on model
    foreignField: 'event', //which field on Booking?
});
module.exports = mongoose.model('Event', eventSchema);
  

Запрос

 exports.createBooking = async (req, res) => {
    req.body.booker = req.user._id;
    req.body.event = req.params.id;
    const bookings = await Booking.aggregate(
        [
            {
                $match: {
                    event: req.params.id,
                },
            },
            { $count: 'bookings' },
        ],
    );
    return res.json(bookings);
};
  

Заранее благодарю! И если вам нужна какая-либо другая информация, пожалуйста, просто дайте мне знать.

Ответ №1:

Вы должны привести свой id из String в ObjectId

 const ObjectID = require('mongodb').ObjectID

[
  { "$match": {
    "event": ObjectId(req.params.id),
  }},
  { "$count": "bookings" },
]
  

Комментарии:

1. К сожалению, это не помогло мне .. Также я получаю ObjectId is not defined , когда использую ObjectId.. Также я запросил bookers с req.user._id , и он работал (также без ObjectId ) на Node.js сторона дела

2. Вы должны импортировать или потребовать его в свой файл. Обновил мой ответ