Структурирование данных MongoDB и запросов mongoose - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь выяснить, как построить мои модели и запросы для моего приложения Я использую экспресс, мангуст и mongodb.

По сути, мое приложение предназначено для мероприятий (вечеринок, турниров, тусовок и т. Д.). У меня есть модель для пользователей и событий. Я пытаюсь сделать так, чтобы пользователь мог быть приглашен на событие. «Пригласить» будет иметь статус «приглашен», «принят», «отклонен». Моя оригинальная идея состояла в том, чтобы иметь это:

    let eventSchema = new Schema({
    Date:{
        type: Date,
        required: true
    },
    Title:{
        type: String,
        required: true
    },
    Description:{
        type: String,
        required: true
    },
    Owner:{
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    Invites: {
        invited : [
            {
                type: Schema.Types.ObjectId,
                ref: 'User'
            }
        ],
        accepted: [
            {
                type: Schema.Types.ObjectId,
                ref: 'User'
            }

        ],
        declined: [
            {
                type: Schema.Types.ObjectId,
                ref: 'User'
            }
        ]

    }
});

Это пользовательская схема:

let userSchema = mongoose.Schema({
    firstName:{
        type: String,
        required: true
    },
    lastName:{
        type: String,
        required: true
    },
    email:{
        type: String,
        required: true
    },
    type:{
        type: String,
        required: true
    },
    events:{
        type: Schema.Types.ObjectId,
        ref: 'events',
    }
});

Это документ в моей базе данных (в mlab):

{
    "_id": {
        "$oid": "5b84adca83599470e9d95d90"
    },
    "Invites": {
        "invited": [
            {
                "$oid": "5b817c2ae7179a43f9ac854e"
            },
            {
                "$oid": "5b817c8ae7179a43f9ac8577"
            }
        ],
        "accepted": [],
        "declined": []
    },
    "Title": "Testtttt",
    "Date": {
        "$date": "2018-08-29T04:00:00.000Z"
    },
    "Description": "testttttt",
    "Owner": {
        "$oid": "5b817c2ae7179a43f9ac854e"
    },
    "__v": 0
}

Я пытаюсь сделать так, чтобы я мог отобразить событие и все его детали. Я сталкиваюсь с проблемами с асинхронностью JS, я верю.

Вот что у меня есть для функции «просмотра» подробностей события:

const displayEventDetails = (req, res, next) => {
    let id = req.params.id;

    Event.findById(id)
        .populate('Owner')
        .exec((err, event) => {
            var tmpEvent = event.toObject();
            var tmpInvitees = [];
            var invitees = tmpEvent.Invites.invited;
            console.trace(invitees);
            invitees.forEach(invitee => {
                User.findById(invitee, (err, invitee) => {
                    tmpInvitees.push(invitee);
                });
            });
            if (err)
                console.log("Error Selecting : %s ", err);
            if (!event)
                return res.render('404');
            // console.trace(event);
            res.render('event_details',
                {
                    event,
                    invitees: tmpInvitees
                }
            );

        });
};

У кого-нибудь есть идеи о том, как я могу получить его, чтобы вышеуказанная функция возвращала и событие, и приглашенных? Я считаю, что это рендеринг до того, как метод .forEach может закончиться, и поэтому приглашенные emtpy ...

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 09 сентября 2018

Я смог понять это. Используя это работало:

const displayEventDetails = (req, res, next) => {
    let id = req.params.id;

    Event.findById(id)
        .populate('Owner')
        .populate('Invites.invited')
        .populate('Invites.accepted')
        .populate('Invites.declined')
        .exec((err, event) => {
            if (err)
                console.log("Error Selecting : %s ", err);
            if (!event)
                return res.render('404');
            var invited = event.Invites.invited;
            var accepted = event.Invites.accepted;
            var declined = event.Invites.declined;
            res.render('event_details', {
                event,
                invited,
                accepted,
                declined
            });
        });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...