根据另一个文档中存在的ID对猫鼬进行排序

时间:2018-07-13 10:45:16

标签: javascript arrays node.js mongodb mongoose

这听起来可能很奇怪,我不确定我的数据库是否对这个数据库那么好,但是下面是我的模型:

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

但是,如果有数百个对象,则可能需要一段时间。那么这里最好的方法是什么?

0 个答案:

没有答案