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

DynamoDB表查询KeyConditionExpression错误

公西俊民
2023-03-14

如何修复以下错误以及为什么会出现“操作数类型:M”?我已经阅读了aws文档并搜索了堆栈溢出,但几个小时后仍然无法解决此问题。我想以iso格式查询一个处于活动状态且日期介于开始日期和结束日期之间的项目。我将错误“操作数类型:M”解释为在操作数:datesell、:start和:end中使用映射类型。但是,所有操作数都只是字符串。

SQL命令类似于:SELECT datesell,profit FROM Items WHERE isActive='true'AND datesell

错误:“message”:“无效的KeyConditionExpression:运算符或函数的操作数类型不正确;运算符或函数:介于之间,操作数类型:M”,“code”:“ValidationException”

代码

AWS.config.update({ region: "us-east-2" });
    const documentClient = AWS.DynamoDB.DocumentClient({ apiVersion: "2012-08-10" });

    const options = {
        TableName: "Items",
        ProjectionExpression: "dateSold, profit",
        IndexName: "isActive-dateSold-index",
        KeyConditionExpression:
          "isActive = :isActive AND dateSold BETWEEN :start AND :end",
        ExpressionAttributeValues: {
          ":start": { S: start.toISOString() },
          ":end": { S: end.toISOString() },
          ":isActive": { S: "true" },
        },
      }

    const result = await documentClient
      .query(options)
      .promise()

架构:

Table: {
    AttributeDefinitions: [
    { AttributeName: "dateSold", AttributeType: "S" },
    { AttributeName: "id", AttributeType: "S" },
    { AttributeName: "isActive", AttributeType: "S" },
    ],
    TableName: "Items",
    KeySchema: [{ AttributeName: "id", KeyType: "HASH" }],
    GlobalSecondaryIndexes: [
    {
        IndexName: "isActive-dateSold-index",
        KeySchema: [
        { AttributeName: "isActive", KeyType: "HASH" },
        { AttributeName: "dateSold", KeyType: "RANGE" },
        ],
    },
    ],
},

共有1个答案

巫马泓
2023-03-14

你有:

ExpressionAttributeValues: {
          ":start": { S: start.toISOString() },
          ":end": { S: end.toISOString() },
          ":isActive": { S: "true" },
        },

一些DynamoDB SDK会自动为您进行类型编码。您不需要编写{S:start.toISOString()},只需编写start即可。toIsoString(),而不将其放入映射中。我不知道你正在使用的SDK是否就是其中之一。例如,Python one(boto3)就可以实现这一点。

顺便问一下,代码中的S而不是"S"(引用的字符串)是如何工作的?

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

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

  • 这里是我的问题:我从amazon dynamodb api中读到,for query中的条件意味着检查列表*中的匹配元素,但为什么它返回错误:*查询键条件不受支持? aws dynamodb查询--表名Music--关键条件{“艺术家”:{“AttributeValueList”:[{“S”:“Wangdong”}、{“S”:“Acme Band”}]、“ComparisonOperator”:“

  • 我正在尝试查询我的dynamodb表以获取提要\u guid和状态\u id=1。但它返回查询键条件不受支持的错误。请查找我的表架构和查询。 以下是我更新该表的查询。

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

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