用这个敲我的头几个小时,我无法理解为什么它不起作用
我有一个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
(数字)
我正在尝试获取具有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);
如果我使用attribute_exists(#s)
,那么它会有效,但对于#lat
或#long
,它不会
我做错了什么?
答案 0 :(得分:1)
您不能直接访问嵌套属性。您应该以这种格式声明
ExpressionAttributeNames: {
'#s': 'state',
'#lat': 'lat',
'#lng': 'long',
'#ts': 'timestamp'
},
并通过以下方式访问属性:
FilterExpression: 'attribute_exists(#s.#lat) AND attribute_exists(#s.#lng)',
答案 1 :(得分:0)
似乎我将项目属性与地图值state
的属性混合在一起。
当我查看生成的结果时,这令人困惑。
对不起噪音。