Dynogels: запрос с использованием сравнения OR
Я пытаюсь оптимизировать следующее scans
в один scan
(или же query
). Я вижу только один способ использовать OR
компаратор с использованием DynamoDB. я использую dynogels
(вилка vogels
) в моем заявлении, но, к сожалению, я не знаю ни одного OR
Функциональность запроса там.
let arrivals = yield Reservation.scan()
.where('room').equals(room)
.where('arrival').between(from, to)
.execAsync().then((reply) => reply.Items.map((item) => item.get()));
let departures = yield Reservation.scan()
.where('room').equals(room)
.where('departure').between(from, to)
.execAsync().then((reply) => reply.Items.map((item) => item.get()));
let combined = arrivals.concat(departures);
return Promise.resolve(combined);
Предлагаемая оптимизация:
return Reservation.scan()
.where('room').equals(room)
.where('arrival').between(from, to)
.or.where('departure').between(from, to)
.execAsync().then((reply) => reply.Items.map((item) => item.get()));
Сканы дают мне оговорки, которые заканчиваются (departure
) или начать (arrival
) (или оба) в указанном диапазоне дат (from
, to
).
1 ответ
Решение
Я думаю, что это может быть достигнуто с помощью filterexpression
,
Пример кода с использованием фильтра выражения:
const scanItem = Reservation.scan().filterExpression('room = :idVal AND ((arrival BETWEEN :arrDateVal1 AND :arrDateVal2) OR (departure BETWEEN :depDateVal1 AND :depDateVal2)) ')
.expressionAttributeValues({ ':idVal' : '2', ':arrDateVal1' : '21-APR-2017', ':arrDateVal2' : '23-APR-2017'
,':depDateVal1' : '21-APR-2017', ':depDateVal2' : '23-APR-2017'});
scanItem.exec((err, result) => {if(!err) {console.log(JSON.stringify(result,undefined, 2))}});
Заметка:-
Не уверен, хотел ли ты специально использовать where
скорее, чем filterexpression
(или) просто хотел добиться результата независимо от where
или же filterexpression
,