#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. Вы должны импортировать или потребовать его в свой файл. Обновил мой ответ