猫鼬:从许多查询减少到一个
Mongoose: Reduce from many queries to one
我目前有一个在 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);
}
这不是很有效,因此我想将其减少为一个查询,按当前 return 数据分组。
我已经尝试在 for 循环中准备 find 参数,但没有成功。任何提示将不胜感激。
您的查询似乎要查找在给定日期开始或结束的记录。由于 week
是一系列连续的天数,这实际上转化为对从 周 开始或在 周 [=] 结束的记录的查询27=].
所以你可以删除for
循环,并定义startDay
和endDay
作为一周的start/end,如下:
const startDay = week.start.startOf('day').toDate();
const endDay = week.end.endOf('day').toDate();
您的其余代码可以保持原样。只需删除带有 for
的行和相应的结束大括号。
但有一个区别是您不会再得到任何重复项。在您当前的代码中,您将获得在一周内开始和结束的记录(但不是在同一天)两次。使用此代码不会发生这种情况。
我目前有一个在 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);
}
这不是很有效,因此我想将其减少为一个查询,按当前 return 数据分组。
我已经尝试在 for 循环中准备 find 参数,但没有成功。任何提示将不胜感激。
您的查询似乎要查找在给定日期开始或结束的记录。由于 week
是一系列连续的天数,这实际上转化为对从 周 开始或在 周 [=] 结束的记录的查询27=].
所以你可以删除for
循环,并定义startDay
和endDay
作为一周的start/end,如下:
const startDay = week.start.startOf('day').toDate();
const endDay = week.end.endOf('day').toDate();
您的其余代码可以保持原样。只需删除带有 for
的行和相应的结束大括号。
但有一个区别是您不会再得到任何重复项。在您当前的代码中,您将获得在一周内开始和结束的记录(但不是在同一天)两次。使用此代码不会发生这种情况。