构建MongoDB数据和Mongoose查询

时间:2018-09-07 18:19:05

标签: javascript node.js mongodb express mongoose

我正在尝试弄清楚如何对我的应用程序进行模型化和查询。我正在使用express,mongoose和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方法完成之前渲染的,因此被邀请者是空的...

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我能够弄清楚。使用此方法有效:

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