javascript - 结构化 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 方法完成之前渲染,所以被邀请者是空的......
任何帮助表示赞赏!
解决方案
我能够弄清楚。使用这个工作:
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
});
});
};
推荐阅读
- regex - 正则表达式难以过滤结果
- javascript - 登出时服务器不可达怎么办
- python - 如何在 Python 中将问题和分数放在一起
- java - 从 firebase 数据库获取数据时,期望开始数组时出错
- ssl - Certbot 自动配置后站点未启用 ssl
- mysql - 使用 Spring Boot JPA 在数据库中插入多行
- javascript - 数据准备好后,如何让我的不和谐机器人编辑自己的最后一条消息
- python - 有没有办法从视图函数中访问 WTForms RadioField 标签?
- c++ - 如何从文件系统获取 std::string 或 char[]?
- shell - 为什么 awk 给我一个致命错误:I/O?