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,

Другие вопросы по тегам