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

2024-03-03

这是我的 DynamoDB 当前数据:

我的目标是创建一个查询,该查询过滤组集中的结果(类似于“默认”),然后按优先级排序,然后将结果过滤到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);
      }

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

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


链接到我的其他答案 https://stackoverflow.com/a/47592450/592792使用设计的主表。

该方法需要修改groupUserStatus 中的建模从带有字符串集的单个记录到带有字符串的多个记录。这是因为 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   |
+---------+----------+--------+-------+----------+--------+

Tasks:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按优先级和组值对结果进行排序,然后过滤结果 的相关文章

  • Firebase CLI 部署错误:“现在在 Firebase CLI 中禁用部署到 Node.js 10 以下的运行时。”

    我有一个使用 Cloud Functions for Firebase 的项目 在将 Firebase CLI 更新到版本 9 0 0 后 我收到一条错误消息 错误 函数目录中的 package json 有一个引擎字段 不受支持 有效的选
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • 什么是 TTY?如何在 Ubuntu 上启用它?

    我目前正在设置一个 Node js 服务器 并且在这里使用调试模块https github com visionmedia debug https github com visionmedia debug 我正在尝试启用它 以便我可以在输出
  • NodeJs/WS:如何抛出服务器端在客户端处理的错误?

    当我的 websocket 有超过 2 个连接时 我试图在服务器端抛出错误 我有这个不错的客户端onerror方法 但我无法到达我的代码的那部分 我正在使用 nodeJS 和包ws其中有关于错误处理的最小文档 服务器 js theWebSo
  • 将 EC2 实例注册到 ECS 集群,无需公网 IP

    我很难将在我的 VPC 和私有子网上 没有附加互联网网关 创建的实例添加到 ECS 集群 目前 我设法做到这一点的唯一方法是添加公共 IP 并配置 NAT 实例 网关 如何使用具有私有子网的 ECS 集群 我想我已经在 AWS 文档中找到了
  • 角度编译速度慢

    我有一个API in Symfony PHP 我用它来测试postman它就像一个魅力 但当我这样做时ng serve aot optimization应用程序开始构建并且消息compiled successfully 需要一分多钟 当我需
  • 如何在 Lambda 中将对象上传到 S3?

    似乎无法将对象上传到 Lambda 中的 S3 本地一切正常 日志中没有错误可以显示出了什么问题 代码如下 console log Loading function var AWS require aws sdk var s3 new AW
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 在express js中禁用http方法

    我正在我的 Express 应用程序上进行 nessus 测试 这是我得到的 基于每种方法的测试 HTTP 方法 ACL CHECKOUT COPY DELETE GET HEAD LOCK MERGE MKACTIVITY MKCOL 移
  • 如何让 Angular 监视多个库的更改并在需要时重新编译

    这个问题与让 Angular 应用程序监视库更改并进行自我更新 https stackoverflow com questions 60473727 make angular app watch for libraries changes
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • if(err) 抛出错误;错误:非法参数:字符串,未定义

    我现在有 module exports comparePassword function candidatePassword hash callback console log candidatePassword console log h
  • [node][mocha]使用 mocha 测试时无法访问全局变量

    我正在尝试为快速节点应用程序创建单元测试 我希望用于测试的配置与生产中使用的配置不同 因此我实现了以下内容 In my index js 我将配置加载到全局变量中 如下所示 global env global env config requ
  • 如何将yarn add/npm install与monorepos一起使用

    我需要从 GitHub 中的私有 monorepo 下载节点包 类似于 monorepoProject subProjectA subProjectB 还有两个子项目A and 子项目B是 typescript 项目 如下图所示 subPr
  • 获取当前范围内所有定义的变量

    我正在解析一个包含以下内容的网站 hmapId 7 42500000000626135 hmapStartInterv 7 750 hmapEndInterv 7 846 hmapUrlInterv 7 some url hmapNameI
  • 节点js(获取连接)

    var nodePort 3030 var express require express var app express var bodyParser require body parser var db require mysql va
  • 在AWS EC2上挂载NVME磁盘

    所以我在每个节点上使用 NVME 磁盘创建了 i3 large 这是我的过程 lsblk gt nvme0n1 检查 nvme 是否尚未安装 sudo mkfs ext4 E nodiscard dev nvme0n1 sudo mount
  • model.save() 返回无效输出

    我正在使用本文中的 Node js mongodb 和express 对 REST Api 进行简单测试 MERN 第一部分 使用 Node js 和 Express 构建 RESTful API https medium com week
  • 类型错误:require.config 不是一个函数

    我正在使用 require js 作为早午餐项目的一部分 这段代码抛出错误 require config require config is not a function paths jquery lib jquery underscore
  • Docker Build 找不到 pip

    尝试关注一些 1 https aws amazon com blogs aws run docker apps locally using the elastic beanstalk eb cli 2 http docs aws amazo

随机推荐