2017-04-23 4 views
1

Ich versuche, die folgenden scans zu einem einzigen (oder query) zu optimieren. Der einzige Weg, den ich sehe, ist zu verwenden use a OR comparator using DynamoDB. Ich benutze dynogels (Gabel von vogels) in meiner Anwendung, aber leider ist mir keine OR Abfrage-Funktionalität in dort bekannt.Dynogels: Abfrage mit ODER-Vergleich

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);

Vorgeschlagen Optimierung:

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()));

Die Scans erhalten mir die Vorbehalte, die Ende (departure) oder Start (arrival) (oder beides) in ein bestimmter Datumsbereich (from, to).

Antwort

3

Ich denke, das kann mit filterexpression erreicht werden.

Code Beispielfilterexpression mit: -

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))}}); 

Hinweis: -

Nicht sicher, ob Sie speziell where wollten lieber verwenden, als filterexpression (oder) wollte nur unabhängig vom Ergebnis erzielen von where oder filterexpression.

+0

Danke! Werde es ausprobieren. War sich der 'filterExpression'-Syntax nicht bewusst und verwendete nur die nette' Dynogels'-Syntax. – btype