我目前在for-循环中设置了多个对数据库的请求。
// 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参数,但没有得到多大进展。任何暗示都将不胜感激。
发布于 2020-08-20 15:34:56
您的查询似乎找到了在给定的一天内开始或结束的记录。由于week是连续几天的范围,这实际上转化为对记录的查询,这些记录要么从那个星期开始,要么在那个星期结束。
因此您可以删除for循环,并将startDay和endDay定义为一周的开始/结束,如下所示:
const startDay = week.start.startOf('day').toDate();
const endDay = week.end.endOf('day').toDate();剩下的代码可以保持原样。只需删除与for和相应的结束大括号线。
不过,一个不同之处在于,您将不再得到任何副本。在当前的代码中,您将得到一周开始和结束(但不是同一天)两次的记录。这段代码不会发生这种情况。
https://stackoverflow.com/questions/63507619
复制相似问题