DynamoDB attribute_exists不起作用

时间:2017-06-27 11:52:13

标签: node.js amazon-dynamodb

用这个敲我的头几个小时,我无法理解为什么它不起作用

我有一个DynamoDBv2表(顶级属性显示为单独的列),其中包含以下项目:

{
    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
}

主分区键:device_id(字符串)

主要排序键:timestamp(数字)

我正在尝试获取具有latlong属性的特定设备的最新项目。

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

如果我使用attribute_exists(#s),那么它会有效,但对于#lat#long,它不会

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您不能直接访问嵌套属性。您应该以这种格式声明

 ExpressionAttributeNames: {
    '#s': 'state',
    '#lat': 'lat',
    '#lng': 'long',
    '#ts': 'timestamp'
},

并通过以下方式访问属性:

FilterExpression: 'attribute_exists(#s.#lat) AND attribute_exists(#s.#lng)',

答案 1 :(得分:0)

似乎我将项目属性与地图值state的属性混合在一起。 当我查看生成的结果时,这令人困惑。

对不起噪音。