当前位置: 首页 > 知识库问答 >
问题:

DynamoDB,如何查询BEGINS\u with

狄海
2023-03-14

我正在使用DocumentClient进行查询。并将无服务器框架与DynamoDb结合使用。

我试图查询BEGINS_WITH不提供任何主键。

以下是我的数据:

[
  {
    id: 1,
    some_string: "77281829121"
  },
  {
    id: 2,
    some_string: "7712162hgvh"
  },
  {
    id: 3,
    some_string: "7212121"
  }
]

这是我的无服务器。yml[我猜是表格配置]:

Resources:
 IPRecord:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        TableName: ${file(./serverless.js):Tables.IPRecord.name}
        BillingMode: PAY_PER_REQUEST
        AttributeDefinitions:
          - AttributeName: 'id'
            AttributeType: 'S'
          - AttributeName: 'some_string'
            AttributeType: 'S'
        KeySchema:
          - AttributeName: 'id'
            KeyType: 'HASH'
        GlobalSecondaryIndexes:
          - IndexName: ${file(./serverless.js):Tables.IPRecord.index.ID}
            KeySchema:
              # ...some more index goes here
              - AttributeName: 'some_string'
                KeyType: 'RANGE'
            Projection:
              ProjectionType: 'ALL'

问:使用DocumentCareet,我想查询some_string的前几个元素。这将返回所有文档,即匹配。就像在这种情况下,我想查询{some_string:"77"},它会返回

 [{
    id: 1,
    some_string: "77281829121"
  },
  {
    id: 2,
    some_string: "7712162hgvh"
  }]

目前我的查询如下所示[这给出错误][在本地DynamoDB JS shell中运行]:

var params = {
    TableName: '<TABLE_NAME>',
    IndexName: '<INDEX_NAME>',
    KeyConditionExpression: 'begins_with(some_string,:value)',
    ExpressionAttributeValues: { 
      ':value': '77'
    }
};
docClient.query(params, function(err, data) {
    if (err) ppJson(err);
    else ppJson(data); 
});

看起来上面的查询需要一个主键,在我的情况下是id。如果我通过它,那么它将指向一个文档。

以下是我迄今为止取得的成就:

var params = {
    TableName: '<TABLE_NAME>',
    FilterExpression: 'begins_with(some_string,:value)',
    ExpressionAttributeValues: { 
      ':value': '77'
    },
    Select:'COUNT' //as i only required COUNT
};
docClient.scan(params, function(err, data) {
    if (err) ppJson(err);
    else ppJson(data); 
});

上述查询符合我的要求。但任何更好的方法或解决方案都是受欢迎的。

共有1个答案

公冶昆杰
2023-03-14

如果beginswith查询中的字符数总是随机的,我看不到使用dynamodb解决它的选项。

但假设至少有3个字符。然后您可以执行以下操作。

将您的Dynamodb架构更新为

 IPRecord:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        TableName: ${file(./serverless.js):Tables.IPRecord.name}
        BillingMode: PAY_PER_REQUEST
        AttributeDefinitions:
          - AttributeName: 'id'
            AttributeType: 'S'
          - AttributeName: 'some_string'
            AttributeType: 'S'
        KeySchema:
          - AttributeName: 'id'
            KeyType: 'HASH'
          - AttributeName: 'some_string'
            KeyType: 'RANGE'

而不是储存

[
  {
    id: 1,
    some_string: "77281829121"
  },
  {
    id: 2,
    some_string: "7712162hgvh"
  },
  {
    id: 3,
    some_string: "7212121"
  }
]

存储为

[
  {
    id: 772,
    uniqueid:1,
    some_string: "77281829121"
  },
  {
    id: 771,
    uniqueid:2,
    some_string: "7712162hgvh"
  },
  {
    id: 721,
    uniqueid:3,
    some_string: "7212121"
  }
]

其中id始终是原始some\u字符串的前3个字符。

现在,假设您必须查询以abcx开头的所有项目

选择*id=abc和some_string从abcx开始

但是你应该总是尝试在id中有更多的字符,这样负载是随机分布的。例如,如果只有2个字符,只有36*36 id是可能的,如果有3个字符36*36 id是可能的。

 类似资料:
  • 给定以下代码,如果给定表的排序键没有以“account\uu”开头的排序键,我希望防止重复: 如上所述,如果已经存在PK,我需要防止重复,或者更具体地说,如果PK和SK不以“account\uu0”开头,我需要防止重复。无论我尝试什么,我都会不断得到重复的PK记录。

  • 我有一个AWS DynamoDb表, 我有user_id作为索引或GSI(user_id-index), 还有product_type作为索引或GSI(prod_type-index). 我试图使用KeyConditionExpression来查询DynamoDb表, 但是我得到了一个- 引用- Dynamodb查询错误-不支持查询键条件 https://docs.aws.amazon.com/a

  • 我有带有2个属性id(string,主键),value(string)的Table。当我尝试跟随KeyHarditionExpress时,它会抛出不支持的查询键条件。 从这个链接中,我知道我们只能在主键上使用EQ操作。我怎么才能做到这一点 解决方案:====================================================== 我需要使用begins\u with或c

  • 我刚开始在DynamoDB上建一个社交网站。 我将有相当数量的数据与一个用户相关,我计划将这些全部放入一个表中--例如: 用户ID 出生日期 头发 照片URL 详细信息 可能有几百个属性。 问题: 将这么多数据放入一个表中有什么问题吗? 我如何查询该数据(我是否可以执行类似这样的查询:“所有在这个年龄,这个颜色头发,这个位置,并且这次登录的成员)-假设所有这些数据都包含在表中? 如果一个表的内容很

  • 我对DynamoDB上的查询/扫描限制有疑问。 我的表有1000条记录,对所有记录的查询都返回50个值,但是如果我把设为5,这并不意味着查询将返回前5个值,它只是说对5个项目的查询表(以任何顺序,所以它们可能是非常旧的项目或新的项目),所以我有可能在查询中得到0个项目。如何实际获得查询的最新5项?我需要设置一个为5(数字是例子),因为查询/扫描更多的项目会很昂贵。 该查询具有此输入 我的表的索引是

  • 目前我使用table.query通过匹配分区键和排序键来获取项目。现在新的要求是处理批处理查询-几百个分区键匹配,希望仍然按照每个分区键结果中的排序键进行排序。我发现GetBatchItem每个查询最多可以处理100个项目,但看起来没有排序。这里的一项是DDB中的一行还是一个分区键中的所有行?从性能(查询速度)和价格角度来看,我应该使用哪一个?如果我使用GetBatchItem,我必须自己对结果进