这听起来可能很奇怪,我不确定我的数据库是否对这个数据库那么好,但是下面是我的模型:
event
模型:
var eventSchema = new mongoose.Schema({
'eventTitle': String,
'location': String,
'startDate': Date,
'endDate': Date,
'startTime': String,
'endTime': String,
'createdBy': mongoose.Schema.Types.ObjectId, // Here we will store the _ID from the user EOSP.
'attendants': [
// Here we will store the _ID off all the Users that register for the fair, being Employer or Jobseeker. example: ObjectID('aaaa')
],
'isFinished': {'type': Boolean, 'default': false},
});
generalInfo
模型:
var generalInfoSchema = new mongoose.Schema({
'activeEventId': mongoose.Schema.Types.ObjectId,
});
所以我的想法是:我将获得很多其他信息。因此,我将为他们创建一个文档。我称它为generalInfo
。现在的问题是,我可以有很多事件,但是其中只有一个可以激活。那行得通。我正在这样创建事件:
.post((req, res, next) => {
var r = req.body;
console.log('status', r.status);
Event.create(new Event({
'eventTitle': r.eventTitle,
'location': r.location,
'startDate': r.startDate,
'endDate': r.endDate,
'startTime': r.startTime,
'endTime': r.endTime,
'createdBy': req.user._id, // Here we will store the _ID from the user EOSP.
'attendants': [],
})).then((event) => {
console.log(req.body.status);
GeneralInfo.find().then(doc => {
if (doc.length > 0) {
if (req.body.status === 'true') {
GeneralInfo
.findByIdAndUpdate(doc[0]._id, {'activeEventId': event._id,})
.catch(e => console.log(e));
}
} else {
if (req.body.status === 'true') {
GeneralInfo
.create(new GeneralInfo({'activeEventId': event._id,}))
.catch(e => console.log(e));
}
}
}).catch(e => console.log(e));
}).then(() => res.redirect('/admin')).catch(e => console.log(e))
});
这可行。但是现在我必须在视图中列出所有事件。这就是问题所在。因为它们是按日期排序的(最早的是最早的),但是同时,仅按日期排序不会解决此问题,因为我希望将活动事件显示为第一。活动事件可能在数组的结尾或中间。
这就是我收集收藏的方式:
router.get('/', (req, res) => {
return Promise.all([
GeneralInfo.findOne().then(r => Event.findById(r.activeEventId)).catch(e => console.log(e)),
Event.find(),
]).then(([currentEvent, events]) => {
res.render('admin/', {
title: 'Admin pannel',
user: req.user,
event: currentEvent,
events: events,
});
}).catch(e => console.error(e));
});
这是视图的一部分:
<% for(let i = 0;i < events.length;i++) { let eve = events[i] %>
<tbody>
<tr>
<td>
<%= eve.eventTitle %>
</td>
<td>
<%= eve.location %>
</td>
<td>
<%= eve.startDate %>
</td>
<td>
<%= eve.endDate %>
</td>
<td>
<% console.log(eve._id, event._id); if(eve._id.equals(event._id)) { %>
Active
<% } else { %>
<a href="event/activate/<%= eve._id %>" class="btn btn-danger">Activate</a>
<% } %>
</td>
<td>
<% if (eve.isFinished) { %>
<a href="/reports/details/<%= eve._id %>" class="btn btn-primary">Access Report</a>
<a href="#" class="btn btn-primary">Email Survey</a>
<% } else { %>
<a href="/event/details/<%= eve._id %>">Edit</a>
|
<a href="/event/close/<%= eve._id %>">Close Event</a>
<% } %>
</td>
</tr>
</tbody>
<% } %>
我正在使用ejs模板系统。
所以回顾一下。如何对集合进行排序,以便第一个出现。
我正在考虑像这样交换数组元素:
for (let i = 0; i < events.length; i++) {
if (events[i]._id.equals(event._id)) {
let tmp = events[0];
events[0] = event;
events[i] = tmp;
}
}
但是,如果有数百个对象,则可能需要一段时间。那么这里最好的方法是什么?