2017-04-23 7 views
1

を1つのscan(またはquery)に最適化しようとしています。私が見る唯一の方法は、use a OR comparator using DynamoDBです。 dynogels(フォークはvogels)を私のアプリケーションで使用していますが、悲しいことにそこにはORというクエリ機能はありません。Dynogels: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)(あるいはその両方)での予約を取得指定された期間(fromto)。

答えて

3

これはfilterexpressionを使用して実現できると思います。 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(または)を使用していたかどうかを確認してくださいはちょうどかかわらず、結果を達成するために望んでいました10またはfilterexpressionです。

+0

ありがとうございます!試してみる。 'filterExpression'構文を意識しておらず、ちょうど良い' dynogels'提供構文を使用しました。 – btype

関連する問題