繁体   English   中英

构建MongoDB数据和Mongoose查询

[英]Structuring MongoDB data and mongoose queries

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

任何帮助表示赞赏!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM