Моя структура данных похожа на:
{
_id: ObjectId("5a7f534b337e8d2b97ff2ff"),
cutoff: 3,
schedules: [
{
starts: ISODate('2020-04-22T00:00:00.000Z'),
ends: ISODate('2020-04-22T00:00:00.000Z'),
repeats: 'never'
},
{
starts: ISODate('2020-04-30T00:00:00.000Z'),
ends: ISODate('2020-06-30T00:00:00.000Z'),
repeats: 'monthly'
}
]
}
, и я хочу создать запрос, который выполняет поиск по перекрывающемуся диапазону дат, например:
const from = new Date(2020, 04, 25)
const to = new Date(2020, 05, 5)
await datastore
.collection('things')
.aggregate([
{
$match: {
'schedules.starts': { $lte: to },
'schedules.ends': { $gte: from }
}
}
])
Проблема заключается в том, что я Мне нужно учесть срез в поиске, поэтому я обнаружил $expr
и попытался применить его к своему запросу:
$match: {
'schedules.starts': { $lte: to.toDate() },
'schedules.ends': { $expr: { $gte: { $add: [ from.toDate(), { $multiply: [ '$cutoff', 24, 60, 60000 ] } } } }
}
Я не пытался закончить эксперимент с $expr
, чтобы получить его работать в запросе, но я либо получаю сообщение об ошибке, что он используется неправильно, либо я не получаю никаких результатов. Я не уверен, что делать дальше.
Я рассмотрел вопрос об использовании $project
или $addFields
перед совпадением, чтобы упростить его, но из руководства я понимаю, что это приведет к остановке моих многоключевых индексов. работает.