【发布时间】:2018-05-15 02:21:11
【问题描述】:
这是我的 DynamoDB 当前数据:
我的目标是创建一个查询,该查询过滤组集中的结果(喜欢“默认”),然后按优先级排序,然后将结果过滤到已登录 == true 和状态 == 空闲的那些。
在 SQL 中是这样的
SELECT *
FROM userstatustable
WHERE group == "default"
AND loggedIn == true AND status == "idle"
ORDER BY priority DESC
LIMIT 1
我将如何创建查询来执行此操作?
下面是我对 DynamoDB 表的 serverless.yml 文件描述。
userStatusTable: #This table is used to track a users current status.
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:custom.userStatusTable}
AttributeDefinitions: #UserID in this case will be created once and constantly updated as it changes with status regarding the user.
- AttributeName: userId
AttributeType: S
KeySchema:
- AttributeName: userId
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.pstage}}
WriteCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.pstage}}
我尝试过的事情:
以下是我目前的代码:
const userStatusParams = {
TableName: process.env.USERSTATUS_TABLE,
FilterExpression: "loggedIn = :loggedIn and #s = :status and contains(#g,:group) ",
//Limit: 1,
ExpressionAttributeValues: {
":loggedIn": true,
":status" : "idle",
":group" : "DEFAULT"
},
ExpressionAttributeNames: {"#s": "status","#g" : "group"}
};
var usersResult;
try {
usersResult = await dynamoDbLib.call("scan", userStatusParams);
console.log(usersResult);
}catch (e) {
console.log("Error occurred querying for users belong to group.");
console.log(e);
}
这使用扫描并且能够返回所有符合条件的结果......但是它不会按优先级对结果进行排序降序。
注意:status 和 group 显然是保留关键字,所以我不得不使用 ExpressionAttributeNames 来说明这一点。另请注意,此表最终将有数千名用户。
【问题讨论】:
-
我正在考虑可能为优先级创建一个全局二级索引,并且哈希是 userId,这样至少可以按优先级排序。这行得通吗?
-
scan 不使用索引,你可以吗?否则,组上的全局索引,但它需要是字符串而不是集合,这需要用户所在组的一条记录。
-
我有一个想法,类型或多或少总是相同的,所以我可以使用类型作为哈希键,排序键优先。
-
哈希键的单个值与扫描相同。
-
@JosephAstrahan 我看到你的表中没有范围键。所以你可以把
priority作为范围键,然后上面的scan会自动返回priority排序的结果。
标签: node.js amazon-web-services amazon-dynamodb serverless-framework