【问题标题】:DynamoDB Descending Order fetch recordsDynamoDB 降序获取记录
【发布时间】:2020-09-14 21:33:00
【问题描述】:

我收集了 100 条记录,

集合名称:'用户'

{
   "name":'senthilkumar',  
   "email":'senthily88@gmail.com',  //HashKey
   "age":21,
   "created":1465733486137,         //RangeKey-timestamp
}

我需要通过以下 sql 查询明智地获取记录

select * from users order by created desc limit 10

我如何从 DynamoDB

获得以上查询格式记录

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    Dynamodb 按范围键属性对结果进行排序。您可以将ScanIndexForward 布尔参数设置为true 用于升序或false 用于降序。

    资源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

    使用 KeyConditionExpression 参数提供特定值 为分区键。查询操作将返回所有 具有该分区键值的表或索引中的项目。你可以 可选地通过指定 a 来缩小 Query 操作的范围 KeyConditionExpression 中的排序键值和比较运算符。 您可以使用 ScanIndexForward 参数来获取转发结果 或倒序,按排序键。

    【讨论】:

    • 是,真 = 升序,假 = 降序。
    • 谢谢你的回复,我能得到像 CreateTable 结构和按记录 Json 格式获取顺序的示例,我尝试了更多方法但无法得到降序结果,我知道我的创建表结构错了,请提供Create Table Json & Fetch Records查询格式示例
    • 嘿,你能按降序获取记录吗?我在这里遇到了类似的问题。
    • 这个答案是错误的。 OP想要返回所有行。此答案用于通过特定的唯一 ID 返回所有行的特定子集。
    【解决方案2】:

    将 Json 数据保存到 DynamoDB 我们 put()

    var Newparams = {
        TableName: this.SuffleTableName,
           Item: {
            "userId": /* YOUR PRIMARY KEY */,
            "addedAt": /* YOUR SORT KEY */,
            "status": /* Additional Datas */,
           }
    }
    

    使用 Query() 从 DynamoDB 获取数据

      QueryParam = {
           TableName: 'YOUR TABLE NAME HERE',
           IndexName: 'YOUR INDEX NAME HERE', //IF YOUR CREATED NEW INDEX
           KeyConditionExpression: "UserId = :UserId  ", //YOUR PRIMARY KEY
           ExpressionAttributeValues: {
              ":UserId": UserId,
           },
           ScanIndexForward: false, //DESC ORDER, Set 'true' if u want asc order 
           ExclusiveStartKey: LastEvalVal, //Pagination - LastEvaluatedKeyPair
           Limit: 10 //DataPerReq
        }
    

    【讨论】:

    • 这不会只搜索特定用户吗?您必须在这里传递一个 UserId 吗?
    • 您必须指定主键才能从表中查询数据,您可以将主键更改为其他字段并将tat作为参数传递
    • 好的,谢谢。不会只返回与该主键相关的值吗?如果主键是唯一的,您只会返回一个用户记录?您将如何使用一个主键作为查询返回 10 个不同的用户?
    • 是的,只有你必须在表中创建一个新的索引,其中不同的字段作为主键,并使用新创建的索引名查询 Dynamo 数据库。
    • 这个答案是错误的。 OP想要返回所有行。此答案用于通过特定的唯一 ID 返回所有行的特定子集
    【解决方案3】:

    如果您想返回表中的所有行,则不能使用查询 API,因为该 API 要求您提供分区键值来过滤结果(即假设您的分区关键是 name 您只能使用查询 API 来返回具有 name = 给定值的结果子集,即 name= senthilkumar

    如果要返回表中的所有行,则必须使用 Scan API:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.ReadData.Scan.html

    请注意,所有结果将按 Range Key 的值升序排列。 您无法使用 Scan API 对内容进行反向排序。您需要使用编写代码时使用的任何语言在应用程序层中反转您的结果集,以将结果颠倒过来。

    Scan 无法很好地扩展,并且如果您的表包含具有唯一分区键的项目,则无法使用 Scan 创建分页、反向排序的解决方案

    如果这是您的情况,并且如果您想从 DynamoDB 返回分页 + 反向排序的集合,您将需要重新考虑表的设计以及哪些列是分区键/范围键/索引,以便您可以使用查询 API。

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多