首页 > 解决方案 > 结构化 MongoDB 数据和 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 方法完成之前渲染,所以被邀请者是空的......

任何帮助表示赞赏!

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


我能够弄清楚。使用这个工作:

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

推荐阅读