我与用户之间有一个表格,我想查询在f.x四月创建的所有用户。
创建用户时,将自动为该用户创建一个时间戳。
我在表中创建了一个索引,其中时间戳记是分区键,而id是排序键。
时间戳以Unix毫秒为单位。
这是我对此查询的代码:
GetUsersOnTimestamp(): Promise<any> {
return new Promise( (resolve, reject) => {
const _dynamoDB = new AWS.DynamoDB.DocumentClient();
const startDate = 1554069600000;
const endDate = 1556661600000;
const params = {
TableName: 'user-table',
IndexName: 'timestamp-id-index',
KeyConditionExpression: '#timestamp = :hkey BETWEEN :sdate AND :edate',
ExpressionAttributeNames: {
'#timestamp': 'timestamp'
},
ExpressionAttributeValues: {
':hkey': 'timestamp',
':sdate': startDate,
':edate': endDate,
}
};
我收到以下错误:
ExpressionAttributeValues contains invalid key: Syntax error; key: "hkey"
答案 0 :(得分:3)
您不能有条件地查询分区键。您必须指定一个完整的分区键值,没有任何条件。 BETWEEN
比较运算符仅可用于有条件地查询排序键。
必须将分区键名称和值指定为相等 条件。
您可以选择为排序键提供第二个条件(如果 当下)。排序键条件必须使用以下之一 比较运算符:
- a = b —如果属性 a 等于值 b
,则为true- a —如果 a 小于 b
,则为true- a <= b —如果 a 小于或等于 b
,则为true- a> b —如果 a 大于 b
,则为true- a> = b —如果 a 大于或等于 b
,则为true- a在b和c之间 —如果a大于或等于b且小于或等于c,则为true。
还支持以下功能:
- begins_with(a,substr) —如果属性 a 的值以特定的子字符串开头,则为true。
要获得查询一定范围的时间戳的能力,使用DynamoDB并非一帆风顺。一种解决方案是在项目中添加一个附加字段,其中仅包含时间戳的年份和月份。然后,您可以创建一个全球二级索引(GSI),其中以year-month-field字段为主键,并以完整时间戳记作为排序键。使用这种方法,您可以查询在给定月份创建的所有用户。