DynamoDB getItem - 当N为N时,期望项为S

问题描述 投票:1回答:2

我在表中有一行,其中N值为1而不是0.此字段称为active_duty_manager,我想拉回值为1的行,以便获取用户凭据。

当我使用以下代码查询表时:

var params = {
               AttributesToGet: ['mobile'],
               TableName: 've-users',
               Key: { 'is_active_duty_manager': {N:1} },
               };
ddb.getItem(params, function (err, data) {
  if (err) { 
console.log(err);
  } else { // Call DynamoDB to read the item from the table
           console.log("Success, duty manager =",data.Item.user_id.N);
      }
  })

我收到以下错误:

{ InvalidParameterType: Expected params.Key['is_active_duty_manager'].N to be a string  
at ParamValidator.fail (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:50:37)
at ParamValidator.validateType (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:222:10)
at ParamValidator.validateString (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:154:32)
at ParamValidator.validateScalar (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:130:21)
at ParamValidator.validateMember (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:94:21)
at ParamValidator.validateStructure (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:75:14)
at ParamValidator.validateMember (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:88:21)
at ParamValidator.validateMap (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:117:14)
at ParamValidator.validateMember (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:92:21)
at ParamValidator.validateStructure (/Users/kevin/lambda/dynamo/node_modules/aws-sdk/lib/param_validator.js:75:14)
  message: 'Expected params.Key[\'is_active_duty_manager\'].N to be a string',
  code: 'InvalidParameterType',
  time: 2018-02-26T20:13:09.795Z }

enter image description here

enter image description here

如果我将一行导出为CSV,我可以看到列类型是S或N,例如,active_duty_manager肯定是一个数字。所以问题是为什么错误期望params.Key值是一个字符串?

非常感谢Kevin

amazon-web-services amazon-dynamodb
2个回答
1
投票

所以看着你的表,你在user_id上有一个主键。这意味着你不能在这个表上写一个查询,它会给你询问的结果,无论你写什么都行不通。

在我看来,你基本上有两个选择:

  1. 用is_active_duty_manager等于0的过滤器写一个扫描,但这是一个相当昂贵的扫描,因为它总是会读取所有项目。
  2. 在is_active_duty_manager上创建一个全局二级索引,只写1,否则留空。这样,您将获得一个稀疏索引,其中只包含设置此值的项目。然后,您可以查询此索引,这将非常快速且便宜。

当您的表格非常小​​时,选项1可能仍然适合您。成本优化有点超出范围,祝你好运!


0
投票

看起来你需要像Key: { 'is_active_duty_manager': {'N':'1'} },一样定义密钥

您可能需要使用引号重构整个参数。

var params = {
  "AttributesToGet": ["mobile"],
  "TableName": "ve-users",
  "Key": { "is_active_duty_manager": {"N":"1"} },
};

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html

以下是DynamoDB API参考中的请求语法:

{
   "AttributesToGet": [ "string" ],
   "ConsistentRead": boolean,
   "ExpressionAttributeNames": { 
      "string" : "string" 
   },
   "Key": { 
      "string" : { 
         "B": blob,
         "BOOL": boolean,
         "BS": [ blob ],
         "L": [ 
            "AttributeValue"
         ],
         "M": { 
            "string" : "AttributeValue"
         },
         "N": "string",
         "NS": [ "string" ],
         "NULL": boolean,
         "S": "string",
         "SS": [ "string" ]
      }
   },
   "ProjectionExpression": "string",
   "ReturnConsumedCapacity": "string",
   "TableName": "string"
}
© www.soinside.com 2019 - 2024. All rights reserved.