gpt4 book ai didi

node.js - 按优先级和组值对结果进行排序,然后过滤结果

转载 作者:太空宇宙 更新时间:2023-11-03 22:09:11 24 4
gpt4 key购买 nike

这是我的 DynamoDB 当前数据:

enter image description here

我的目标是创建一个查询,过滤组集中的结果(类似于“默认”),然后按优先级排序,然后将结果过滤到loggedIn == true且status ==idle的结果。

在 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);
}

这使用扫描并且能够返回满足条件的所有结果...但是它不会按优先级对结果进行降序排序

注意:状态和组显然是保留关键字,因此我必须使用 ExpressionAttributeNames 来解释这一点。另请注意,该表最终将包含数千个用户。

最佳答案

链接到我的other answer它使用设计的主表。

此方法需要将 UserStatus 中的group 建模从具有字符串设置的单个记录修改为具有字符串的多个记录。这是因为 DynamoDB 不支持(尽管如此,这也是一个很好的功能请求)对集合进行键入。

主表用于更新/插入/删除,如下所示:

+--------+---------+-------+----------+----------+--------+
| userId | group | type | priority | loggedIn | status |
+--------+---------+-------+----------+----------+--------+
| 123 | default | admin | 1 | true | idle |
+--------+---------+-------+----------+----------+--------+
| 123 | orange | admin | 1 | true | idle |
+--------+---------+-------+----------+----------+--------+
| 124 | default | admin | 3 | false | idle |
+--------+---------+-------+----------+----------+--------+
| 125 | orange | admin | 2 | false | idle |
+--------+---------+-------+----------+----------+--------+
  • 分区/哈希键:userId
  • 排序键:组

在(组、优先级)上设置 GSI。这将用于查询。是的,为此索引选择的组合将有重复项:DynamoDB 不会为此烦恼并且工作得很好。

+---------+----------+--------+-------+----------+--------+
| group | priority | userId | type | loggedIn | status |
+---------+----------+--------+-------+----------+--------+
| default | 1 | 123 | admin | true | idle |
+---------+----------+--------+-------+----------+--------+
| default | 3 | 124 | admin | false | idle |
+---------+----------+--------+-------+----------+--------+
| orange | 1 | 123 | admin | true | idle |
+---------+----------+--------+-------+----------+--------+
| orange | 2 | 125 | admin | false | idle |
+---------+----------+--------+-------+----------+--------+

任务:

  • 更新此表中的用户需要更新/插入与该用户所属的组一样多的行;
  • 删除用户意味着删除该用户的所有项目。
  • 查询通过group = :group 和priority >= :priority 完成,并根据status = 'idle' 和loggedIn = true 进行过滤
    • 一个变体是根据状态或登录进行排序,因为您使用它们进行过滤,这有助于使查询更具选择性,然后根据客户端的优先级进行排序

我应该遵循这种方法吗?我认为当有很多组并且单个组包含高达总用户的20%,并且用户属于2或2个组时,这是一个很好的设计。

关于node.js - 按优先级和组值对结果进行排序,然后过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47585581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com