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