簡體   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