использование поиска в коллекции по сравнению с заполнением с помощью mongoDB / mongoose - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в использовании javascript. Это мой первый настоящий проект, над которым я работаю самостоятельно. Я не смог найти ответа на свой вопрос. Я где-то читал, что когда речь идет об отношениях «один ко многим», «многие» должны иметь ссылку на «один». В настоящее время я делаю это наоборот, когда «один» содержит массив «многие». Схема из моего проекта:

Схема салона:

const salonSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    workingHours: {
        type: String,
        required: true
    },
    workingDays: [
        {
            type: String,
            required: true
        }
    ],
    coordinates: {
        type: String,
        required: true
    },
    images: [
        {
            type: String
        }
    ],
    company: {
        type: Schema.Types.ObjectId,
        ref: 'Company'
    },
    employees: [
        {
            type: Schema.Types.ObjectId,
            ref: 'Employee'
        }
    ],
    bookings: [
        {
            type: Schema.Types.ObjectId,
            ref: 'Booking'
        }
    ]
});

Схема бронирования:

 const bookingSchema = new Schema({
            user: {
                type: Schema.Types.ObjectId,
                ref: 'User',
                required: true
            },
            salon: {
                type: Schema.Types.ObjectId,
                ref: 'Salon',
                required: true
            },
            employee: {
                type: Schema.Types.ObjectId,
                ref: 'Employee',
                required: true
            },
            service: {
                type: Schema.Types.ObjectId, 
                ref: 'Service'
            },
            dateFrom: {
                type: Date, 
                required: true
            },
            dateTo: {
                type: Date, 
                required: true
            },
            price: {
                type: Number, 
                required: true
            },
            bookingType: {
                type: String, 
                required: true
            },
            isAccepted: {
                type: Boolean,
                default: false 
            },
            isCancelled: {
                type: Boolean,
                default: false
            },
            isComplete: {
                type: Boolean,
                default: false
            }
        });

Мой вопрос: нужно ли менять отношения? это плохая практика? Что касается взаимоотношений с сотрудниками, я не вижу в этом проблем, однако меня интересуют заказы. Поскольку я не удаляю их после того, как они были завершены для статистических целей, количество бронирований будет продолжать расти. Меня беспокоит, сколько времени у находки уйдет на просмотр всех документов о бронировании. Разве не было бы лучше иметь заказы, связанные с салоном, в массиве и заполнять их, а не использовать поиск во всей коллекции Booking. В обоих случаях код будет выглядеть примерно так:

Использование populate:

const salon = await Salon.findById({ _id: req.id })
                .populate({ path: 'bookings', populate: { path: 'employee user service' } });

Использование find:

const bookings = await Booking.find({ salon: req.id });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...