DynamoDB attribute_exists 不起作用

Sha*_*dow 7 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
}
Run Code Online (Sandbox Code Playgroud)

主分区键:(device_id字符串)

主排序键:(timestamp数字)

我正在尝试获取具有属性lat和的某个设备的最新项目long

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);
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?

Ank*_*h K 6

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

 ExpressionAttributeNames: {
    '#s': 'state',
    '#lat': 'lat',
    '#lng': 'long',
    '#ts': 'timestamp'
},
Run Code Online (Sandbox Code Playgroud)

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

FilterExpression: 'attribute_exists(#s.#lat) AND attribute_exists(#s.#lng)',
Run Code Online (Sandbox Code Playgroud)


Sha*_*dow 1

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

抱歉产生噪音。