Dynogels:使用 OR 比较查询
Dynogels: Query using OR comparison
我正在尝试将以下 scans
优化为单个 scan
(或 query
)。我看到的唯一方法是使用 use a OR
comparator using 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()));
扫描让我得到在指定日期范围(from
、to
)结束(departure
)或开始(arrival
)(或两者)的预订).
我认为这可以使用 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
。
我正在尝试将以下 scans
优化为单个 scan
(或 query
)。我看到的唯一方法是使用 use a OR
comparator using 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()));
扫描让我得到在指定日期范围(from
、to
)结束(departure
)或开始(arrival
)(或两者)的预订).
我认为这可以使用 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
。