标签: dynamodb-queries

带分页的 DynamoDB Python 查询(不扫描)

我正在使用以下代码通过 DynamoDB 查询进行查询和分页:

class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            return str(o)
        return super(DecimalEncoder, self).default(o)


def run(date: int, start_epoch: int, end_epoch: int):
    dynamodb = boto3.resource('dynamodb',
                              region_name='REGION',
                              config=Config(proxies={'https': 'PROXYIP'}))

    table = dynamodb.Table('XYZ')

    response = table.query(
        # ProjectionExpression="#yr, title, info.genres, info.actors[0]", #THIS IS A SELECT STATEMENT
        # ExpressionAttributeNames={"#yr": "year"},  #SELECT STATEMENT RENAME
        KeyConditionExpression=Key('date').eq(date) & Key('uid').between(start_epoch, end_epoch)
    )

    for i in response[u'Items']:
        print(json.dumps(i, cls=DecimalEncoder))

    while 'LastEvaluatedKey' in response:
        response = table.scan( ##IS THIS INEFFICIENT CODE?
            # ProjectionExpression=pe,
            # FilterExpression=fe,
            # ExpressionAttributeNames=ean,
            ExclusiveStartKey=response['LastEvaluatedKey'] …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-dynamodb dynamodb-queries

1
推荐指数
2
解决办法
3691
查看次数

Dynamo 数据库分页

我想使用aws-sdk 在 dynamodb 中使用分页DocumentClient() 我正在使用 node.js。

我想要做的是获取前 10 个项目,然后将这些值返回给用户。在该用户发出新请求之后,他告诉服务器从 10 开始,服务器从 10 到 20 获取其他 10 并返回响应。我已经尝试过LastEvaluatedKey但我的情况不同。有什么方法可以告诉 dynamodb 从特定的 Item 例如 1 开始,然后设置Limit: 10.

node.js amazon-dynamodb dynamodb-queries

1
推荐指数
1
解决办法
4813
查看次数

使用分区键上的 IN 运算符查询 dynamoDB

我有一个名为 products 的表。它的架构是

  1. CustomerNumber(字符串类型的哈希键)
  2. ProductID(字符串类型的范围键)

我想查询类似于

SELECT * FROM products WHERE CustomerNumber IN ("cust123","cust234"). 
Run Code Online (Sandbox Code Playgroud)

如何实现?

很少观察 -

  1. DynamoDBQueryExpression 将只查询索引/hashKey,而不是像上面的例子那样查询 hashKeys 列表。

  2. 此外,DynamoDBQueryExpression 不支持 IN 、 OR 运算符。

  3. 此外,BatchLoad 仅使用主键(在我的情况下为 customerNumber 和 productID)记录来返回一批记录。

  4. 另外,我不想扫描表格并对其应用过滤器。

  5. 同样在 customerNumber 上创建 GSI 然后查询它不起作用

amazon-dynamodb dynamodb-queries

1
推荐指数
1
解决办法
676
查看次数

嵌套数组上的分页(属性)

我试图在社交网络的 nosql db 模型中遵循“一张表”原则。但它给我带来了很多问题。
假设我的模型现在看起来像这样:

Table-Groups
{
  name: "Group1"
  topics: [
    name: "Topic1"
    posts: [
      {
        id: "tid1"
        author: "Walter White"
        message: "Hello from Post1"
        comments: [
          {
            id: "cid1"
            author: "Jessy"
            message: "Yo nice post Mr. White"
          }
          {
            id: "cid2"
            author: "Saul"
            message: "Jeze Walt"
          }
        ]
      }
      //... Many other posts here    
    ]
      //... Many other topics within the group
  ]
}
//... Not so many other groups
Run Code Online (Sandbox Code Playgroud)

我可以对帖子或评论数组进行分页吗?
因为我会(理论上)在 post 数组中有很多帖子,所以我必须阅读大量数据,而实际上我只想阅读最新的 10 个帖子。帖子中的数组评论也是如此。有没有可能对这些数组进行分页?

我可以将主题数组中的属性“name”用作 sortKey 吗?(topic.name) …

amazon-web-services nosql amazon-dynamodb dynamodb-queries

1
推荐指数
1
解决办法
389
查看次数

用于开始日期结束日期范围查询的 Dynamodb 模型数据

我的问题可能类似于以下问题
如何查询介于开始日期和结束日期之间的条目 - DynamoDB,
但我认为在我的要求和我正在寻找的内容方面有所不同。

对于特定的分区键值,我想查询当前日期位于开始日期和结束日期之间的所有记录。

我的用例是会创建调查。每个调查都有一个名称并属于一个类别。每个调查都有一个开始日期和结束日期。我需要查询给定类别的所有活动调查的名称,即当前日期位于开始日期和结束日期之间的类别的所有调查。此外,调查可以是活动的/非活动的。

到目前为止做了什么:
表设计:表 tbl_surveys
分区键:tbl_pk_surv
排序键:tbl_sk_surv
一个“数据”属性:data_attr

我使用tbl_sk_surv 作为分区键data_attr 作为 Sortkey创建了一个GSI

我为每个调查创建 2 条记录:
tbl_pk_surv |tbl_sk_surv|data_attr|cat_name|start_date|end_date|status Surv-0tOrClRnTz| SURVEY | Survey1 | Cat1 |1564012800|1564876799|1
tbl_pk_surv | tbl_sk_surv | data_attr| survey_name | status Surv-0tOrClRnTz | Cat1 | 1564012800-1564876799 | Survey1 | 1

所以我将 startdate 和 enddate 放在第二条记录的 1 列中。我的计划是,我想查询 GSI 分区键值“Cat1”,并获取“Cat1”的所有调查名称。请让我知道如何查询 GSI 排序键值 1564012800-1564876799,以便我可以在开始日期和结束日期之间进行查询。

请注意,我放置了第一条记录,静态值“SURVEY”作为 pk_sk_surv 属性的值,以便我可以通过使用“SURVEY”作为分区键值查询 GSI 来查询所有调查记录。我正在尝试实现单表 no-sql 设计。

我是 NoSql Design 的新手,请指导我如何为我的需求建模数据和查询。

amazon-dynamodb dynamodb-queries

1
推荐指数
1
解决办法
1457
查看次数

没有范围键的 DynamodbDB 查询

我有两列定义的表,第 1hash key列是 ,第 2 列是range key. 我想获得使用相同哈希键定义的所有项目(因此范围键无关紧要)。

我尝试使用new KeyPair().withHashKey(k). 但它会抛出异常说no RANGE key value present

我唯一的选择是对表格进行扫描以实现这一目标吗?

amazon-dynamodb dynamodb-queries

1
推荐指数
1
解决办法
437
查看次数

在 DynamoDB 模板中使用查询操作进行分页和过滤

我希望能够在考虑限制之前使用查询操作过滤分页结果。是否有任何建议可以在过滤后的结果上获得正确的分页?

我想使用以下逻辑实现 DynamoDB 扫描或查询:

Scanning -> Filtering(boolean true or false) -> Limiting(for pagination)
Run Code Online (Sandbox Code Playgroud)

但是,我只能使用以下逻辑实现扫描或查询:

Scanning -> Limiting(for pagination) -> Filtering(boolean true or false)
Run Code Online (Sandbox Code Playgroud)

注意:我已经尝试过全局二级索引,但在我的情况下它不起作用,因为我有 5 个不同的属性要过滤和限制。

amazon-dynamodb aws-appsync dynamodb-queries

1
推荐指数
1
解决办法
2474
查看次数

我如何在DynamoDb中加入两个表?

我是DynamoDB的新手,任何人都可以帮我在DynamoDB中使用JOIN吗?我使用无服务器框架和映射模板.我有POSTUSER表. POSTuserId字段.如何获得有关用户信息的所有帖子?在MYSQL中,我可以使用JOIN但它在DynamoDB中如何工作?我读了2年前创建的stackoverflow中的帖子.而且有人写道,它不可用.也许事情发生了变化......?

amazon-web-services amazon-dynamodb serverless-framework dynamodb-queries

0
推荐指数
1
解决办法
988
查看次数

我是否为工作选择了错误的数据库?DynamoDB 与 Aurora

我正在建立一个房地产网站,其中包含房产列表、一些搜索过滤器和一个带有自动完成功能的地址字段。它工作正常,但自动完成性能非常慢。几乎需要一秒钟才能得到回应。考虑到所有服务都在我所在的地区,我认为这很慢。

我即兴进行了一种“模糊”搜索,我在其中拆分了源字符串(例如,如果用户搜索“Jumeirah, Rimal”变为 [“jumeirah”, “rimal”])并尝试匹配某个位置的完整“路径”(一个像 locationID/city/community/sub-community/tower 这样的字符串,在这个例子中是“are.1.50/Dubai/Jumeirah Beach Residence/Rimal”)到分割字符串的每个部分。表达式变成这样:

contains(#path, :fullString) OR 
(contains(#path, :stringOne) AND contains(#path, :stringTwo) AND ... )
Run Code Online (Sandbox Code Playgroud)

重要的是,因为我需要使用“包含”运算符,所以我不能用 KeyExpression 有效地完成它,我需要使用较慢的 FilterExpression 进行完整扫描。我只有 7,500 个位置可供搜索,而且性能已经很差了。

这让我思考是否应该使用像 Aurora 这样的基于 SQL 的数据库。AFAIK SQL 可以非常高效地执行复杂的查询。

我还将研究 AWS 的弹性搜索解决方案。

你怎么认为?

amazon-web-services amazon-dynamodb amazon-aurora dynamodb-queries

0
推荐指数
1
解决办法
309
查看次数

仅在主(分区)键上使用 Between 运算符的 DynamoDb 查询

我有一个 Dynamo 表,其中只有分区键 - “CreatedAt”和一些其他属性。

我想写一个查询,但我不会得到结果。CreatedAt 位于 LastSunday 和 Today 之间的项目的数量。

我已将日期以字符串格式存储为“2021-03-09T14:33:29Z”。

我不想使用 GSI。

使用以下查询时,我收到错误 - “不支持查询关键条件”

这是我的代码:

 var queryRequest = new QueryRequest
            {
                TableName = myTableName,
                KeyConditionExpression = "CreatedAt BETWEEN :LastMonday AND :TodaysDate",
            };
            Dictionary<string, AttributeValue> expressionAttributeValues = new Dictionary<string, AttributeValue>();
            expressionAttributeValues.Add(":TodaysDate", new AttributeValue { S = "2021-03-09T14:33:29Z" });
            expressionAttributeValues.Add(":LastMonday", new AttributeValue { S = "2021-03-02T14:33:29Z" });
            queryRequest.ExpressionAttributeValues = expressionAttributeValues;
            var response = await awsDynamoClient.QueryAsync(queryRequest); 
Run Code Online (Sandbox Code Playgroud)

.net c# amazon-dynamodb dynamodb-queries

0
推荐指数
1
解决办法
2902
查看次数

使用 boto3 有条件地将项目插入 dynamodb 表中错误属性名称是保留关键字

如果项目(状态)不存在,我将调用此函数来放置项目,这是我从这里引用的内容:How do I Conditionally insert an item into a dynamodb table using boto3 ..

    def put_items_if_doesnt_exist():
      dynamodb = boto3.resource('dynamodb',region_name='us-east-1')
      try:
          table = dynamodb.Table('awssolutions-ssm-hybrid-table')
          response = table.put_item(
          Item={
                  'name':'Execution',
                  'state': 'Locked',
              },
          ConditionExpression='attribute_not_exists(state) AND attribute_not_exists(name)'
          )
      except ClientError as e:
          # Ignore the ConditionalCheckFailedException
          if e.response['Error']['Code'] != 'ConditionalCheckFailedException':
              raise
Run Code Online (Sandbox Code Playgroud)

这里的问题是状态是保留字,因此它失败并出现错误:

[ERROR] ClientError: An error occurred (ValidationException) when calling the PutItem operation: Invalid ConditionExpression: Attribute name is a reserved keyword; reserved keyword: state
Run Code Online (Sandbox Code Playgroud)

有什么建议来处理这个问题吗?

python amazon-web-services amazon-dynamodb boto3 dynamodb-queries

0
推荐指数
1
解决办法
2413
查看次数