【发布时间】:2019-05-31 04:41:30
【问题描述】:
假设我有一些 MongoDB 事件文档,每个文档都有许多在不同日期发生的会话。我们可以将其表示为:
db.events.insert([
{
_id: '5be9860fcb16d525543cafe1',
name: 'Past',
host: '5be9860fcb16d525543daff1',
sessions: [
{ date: new Date(Date.now() - 1e8 ) },
{ date: new Date(Date.now() + 1e8 ) }
]
}, {
_id: '5be9860fcb16d525543cafe2',
name: 'Future',
host: '5be9860fcb16d525543daff2',
sessions: [
{ date: new Date(Date.now() + 2e8) },
{ date: new Date(Date.now() + 3e8) }
]
}
]);
我想查找所有尚未举行第一次会议的活动。所以我想找到“未来”而不是“过去”。
目前我正在使用 Mongoose 和 Express 来做:
Event.aggregate([
{ $unwind: '$sessions' }, {
$group: {
_id: '$_id',
startDate: { $min: '$sessions.date' }
}
},
{ $sort:{ startDate: 1 } }, {
$match: { startDate: { $gte: new Date() } }
}
])
.then(result => Event.find({ _id: result.map(result => result._id) }))
.then(event => Event.populate(events, 'host'))
.then(events => res.json(events))
但我觉得我正在为此制造恶劣的天气。数据库中的两次命中(如果包含 populate 语句,则为三次)和一个大而复杂的 aggregate 语句。
有没有更简单的方法来做到这一点?理想情况下,只涉及一次访问数据库。
【问题讨论】:
标签: node.js mongodb express mongoose aggregation-framework