2017-06-27 2 views
0

meinen Kopf hämmern für ein paar Stunden mit diesem und ich kann nicht verstehen, warum es nicht istDynamoDB attribute_exists funktioniert nicht

Arbeits

Ich habe eine DynamoDBv2 Tabelle (Top-Level-Attribute werden als separate Spalten dargestellt) mit Gegenständen wie diese:

{ 
    gateway: 'gateway1', 
    device_id: '2', 
    state: { temperature: 20, humidity: 30, pressure: 101049 }, 
    timestamp: 1498331237261 
}, 
{ 
    gateway: 'gateway1', 
    device_id: '2', 
    state: { temperature: 20, humidity: 30, pressure: 101049, lat: 2, long: 1 }, 
    timestamp: 1498331237262 
} 

Primäre Partition Schlüssel: device_id (String)

Primäre Sortierschlüssel: timestamp (Number)

Ich versuche, das neueste Element für ein bestimmtes Gerät mit den Attributen lat und long zu erhalten.

const docClient = new AWS.DynamoDB.DocumentClient(); 
const id = 2; 
const params = { 
    TableName: 'device_telemetry', 
    KeyConditionExpression: 'device_id = :id', 
    ProjectionExpression: '#s, #lat, #lng, #ts', 
    FilterExpression: 'attribute_exists(#lat) AND attribute_exists(#lng)', 
    ExpressionAttributeNames: { 
     '#s': 'state', 
     '#lat': 'state.lat', 
     '#lng': 'state.long', 
     '#ts': 'timestamp' 
    }, 
    ExpressionAttributeValues: { 
     ':id': id.toString() 
    }, 
    ScanIndexForward: false, 
     Limit: 1 
    }; 

    const onResult = (res) => { 
     console.info('devices res for: ', id, res); 
    }; 

    console.info('query: ', params); 
    docClient.query(params).promise().then(onResult); 

Wenn ich attribute_exists(#s) verwenden, dann funktioniert es, aber für #lat oder #long es nicht

Was mache ich falsch?

Antwort

0

Scheint, ich habe Elementattribute mit den Attributen des Kartenwerts von state gemischt. Es war verwirrend, als ich das generierte Ergebnis betrachtete.

Entschuldigung für das Rauschen.

Verwandte Themen