代码之家  ›  专栏  ›  技术社区  ›  Khan

DynamoDB primarykey时间戳

  •  3
  • Khan  · 技术社区  · 6 年前

    iam试图在dynamodb中查询主键为时间戳的数据集。 首先,我想获取特定sensorId的所有数据。 我尝试了扫描(scan.json):

    {
    "sensorId": {
        "AttributeValueList": [{
            "S": "1234"
        }],
        "ComparisonOperator": "EQ"
    }
      }
    

    此Json通过CLI命令使用:

    aws dynamodb scan --table-name sensorData --scan-filter file://scan.json 
    

    这是成功的,并为我提供了指定sensorid的所有数据。

    现在,如果我只想得到时间戳和传感器ID,那么我阅读了关于投影表达式的内容,并尝试进行查询(query.json):

    {
        ":Id":{"S":"1234"}
    }
    

    aws cli命令

    aws dynamodb query --table-name sensorData --key-condition-expression "sensorId= :Id" --expression-attribute-values file://query2.json --projection-expression "timestamp"
    

    给了我:

    调用查询时出错(ValidationException) 操作:无效的ProjectionExpression:属性名称是保留的 关键词;保留关键字:时间戳

    但将“时间戳”替换为“用于测试的sensorId”给了我:

    调用查询时出错(ValidationException) 操作:查询条件缺少关键架构元素:时间戳

    我知道sensorId对key expression无效。。 KeyConditionExpression只接受键属性、哈希键和范围键。 但如何获得结果呢?

    我只想要sensorId的时间戳。 我的Primarykey错了吗?最好使用sensorId作为主键,同时使用时间戳作为范围键?

    1 回复  |  直到 6 年前
        1
  •  9
  •   Ashan    6 年前

    根据您的场景,最好更改密钥。使用SensorID作为分区键,时间戳作为排序键。

    通过这种方式,您可以查询(无需扫描所有项目)给定SensorID的项目。还可以按照时间戳的顺序对它们进行排序。

    如果您有一个更大的数据集(多于几个Killobytes),那么创建一个LSI或GSI来投影给定查询所需的属性将是非常有效的。

    注:时间戳是 reserved word 在DynamoDB中。您可以使用 Expression Attribute Names 避免在查询表达式中使用保留属性时出错。