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不起作用
我究竟做错了什么?
您不能直接访问嵌套属性。您应该以这种格式声明
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)
| 归档时间: |
|
| 查看次数: |
5111 次 |
| 最近记录: |