Amazon dynamodb DynamoDB如何仅按范围查询?

Amazon dynamodb DynamoDB如何仅按范围查询?,amazon-dynamodb,aws-sdk,Amazon Dynamodb,Aws Sdk,我有一个带有散列和范围主键的表。我需要按eventDate和customerId进行查询。结构如下。哈希是一个格式类似UUID的唯一ID,范围是customerId。我还有一个LSI,其范围键为eventDate。我想用param进行查询: 'KeyConditionExpression'=>“customerId=:customer\u id” 但我有一个错误: 查询条件缺少关键架构元素:uniqueId 你可能会说我不应该使用无用的散列,但我应该怎么做呢?在此之前,我尝试使用hash和ran

我有一个带有散列和范围主键的表。我需要按eventDate和customerId进行查询。结构如下。哈希是一个格式类似UUID的唯一ID,范围是customerId。我还有一个LSI,其范围键为eventDate。我想用param进行查询:

'KeyConditionExpression'=>“customerId=:customer\u id”

但我有一个错误:

查询条件缺少关键架构元素:uniqueId

你可能会说我不应该使用无用的散列,但我应该怎么做呢?在此之前,我尝试使用hash和range customerId、eventDate,但我无法使用它们,因为无法保证eventDate是唯一的。这意味着如果同时生成三个事件,则只保存最后一个事件


有没有办法将这种结构与dynamodb结合起来?

您可以执行以下操作之一:

  • 将客户ID设置为HashKey,将UUID设置为RangeKey。然后,将在CustomerID和EventDate上定义LSI。您可以在LSI上搜索该表,如下所示:

    // Using DynamoDBMapper in AWS SDK Java
    DynamoDBQueryExpression<YourClass> query = 
        new DynamoDBQueryExpression<YourClass>();
    YourClass hashKeyValues = new YourClass();
    hashKeyValues.setCustomerId(customerId);
    
    Map<String, Condition> rangeKeyConditions = 
        new HashMap<String, Condition>();
    rangeKeyConditions.put("EventDate", 
        new Condition()
            .withConditionalOperator(ConditionalOperator.EQ)
            .withAttributeValue(new AttributeValue(eventDate)));
    
    query.setHashKeyValues(hashKeyValues);
    query.setRangeKeyConditions(rangeKeyConditions);
    query.setIndexName(LSI_CUSTOMER_ID_EVENT_DATE);
    // Execute the query using DynamoDBMapper.
    
    //在AWS SDK Java中使用DynamoDBMapper
    DynamoDBQueryExpression查询=
    新的DynamoDBQueryExpression();
    YourClass hashKeyValues=新建YourClass();
    setCustomerId(customerId);
    映射范围键条件=
    新的HashMap();
    rangeKeyConditions.put(“EventDate”,
    新条件()
    .带条件运算符(条件运算符EQ)
    .带有AttributeValue(新AttributeValue(eventDate));
    query.setHashKeyValues(hashKeyValues);
    query.setRangeKeyConditions(rangeKeyConditions);
    query.setIndexName(LSI\u客户\u ID\u事件\u日期);
    //使用DynamoDBMapper执行查询。
    
  • 在CustomerID上创建一个全局二级索引(GSI),作为GSI的HashKey,并将EventDate作为RangeKey

    // Using DynamoDBMapper in AWS SDK Java
    DynamoDBQueryExpression<YourClass> query = 
        new DynamoDBQueryExpression<YourClass>();
    YourClass hashKeyValues = new YourClass();
    hashKeyValues.setCustomerId(customerId);
    
    Map<String, Condition> rangeKeyConditions = 
        new HashMap<String, Condition>();
    rangeKeyConditions.put("EventDate", 
        new Condition()
            .withConditionalOperator(ConditionalOperator.EQ)
            .withAttributeValue(new AttributeValue(eventDate)));
    
    query.setHashKeyValues(hashKeyValues);
    query.setRangeKeyConditions(rangeKeyConditions);
    query.setIndexName(GSI_CUSTOMER_ID_EVENT_DATE);
    // Execute the query using DynamoDBMapper.
    
    //在AWS SDK Java中使用DynamoDBMapper
    DynamoDBQueryExpression查询=
    新的DynamoDBQueryExpression();
    YourClass hashKeyValues=新建YourClass();
    setCustomerId(customerId);
    映射范围键条件=
    新的HashMap();
    rangeKeyConditions.put(“EventDate”,
    新条件()
    .带条件运算符(条件运算符EQ)
    .带有AttributeValue(新AttributeValue(eventDate));
    query.setHashKeyValues(hashKeyValues);
    query.setRangeKeyConditions(rangeKeyConditions);
    query.setIndexName(GSI\u客户\u ID\u事件\u日期);
    //使用DynamoDBMapper执行查询。
    
  • 您可能知道使用GSI的成本,如果不知道,您可能想检查一下