我目前有一个设置,其中有一个循环中对数据库的多个请求。
// week is a moment-range object
for (const day of week.by('day')) {
// get start and end of day
const startDay = day.startOf('day').toDate();
const endDay = day.endOf('day').toDate();
// I would like to reduce this query to one
const data = await Model.find({
$or: [
{
$and: [{ start: { $gte: startDay } }, { start: { $lt: endDay } }],
},
{
$and: [{ end: { $gte: startDay } }, { end: { $lt: endDay } }],
},
],
})
.sort({ start: 'asc' })
.select('_id someref')
.populate('someref', 'name');
console.log(data);
}
这不是很有效,因此我想将其简化为一个查询,按当前数据返回分组。
我已经尝试过在for循环中准备find参数,但是距离还很远。任何提示将不胜感激。
答案 0 :(得分:0)
您的查询似乎找到了在给定日期开始或结束的记录。由于week
是连续几天的范围,因此实际上可以转换为查询开始于 week 或结束于 week 的记录。>
因此,您可以删除for
循环,并将startDay
和endDay
定义为一周的开始/结束,如下所示:
const startDay = week.start.startOf('day').toDate();
const endDay = week.end.endOf('day').toDate();
其余代码可以保持原样。只需用for
和相应的大括号删除行即可。
尽管有一个区别是您将不再获得任何重复。在您当前的代码中,您将获得在一周中(但不是在同一天)两次 开始和结束的记录。这段代码不会发生这种情况。