【问题标题】:DynamoDB and DocumentClient giving different key values?DynamoDB 和 DocumentClient 提供不同的键值?
【发布时间】:2021-01-11 09:01:17
【问题描述】:

我正在尝试使用 aws DynamoDB,并阅读了一些关于在表上创建、读取和更新项目的指南。但是由于某种原因,我在使用 documentClient 和 DynamoDB 时得到了不同的键值;即键值略有不同。

在我的代码中:

const dynamodb = new AWS.DynamoDB();
let docClient = new AWS.DynamoDB.DocumentClient();

async function returnServers(){
    await dynamodb.scan({TableName: 'pixelbot_servers'}, function(err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("dynamodb scan succeeded:", JSON.stringify(data, null, 2));
        }
    });
    
    await docClient.scan({TableName: 'pixelbot_servers'}, function(err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("docClient scan succeeded:", JSON.stringify(data, null, 2));
        }
    });

但是,当我查看控制台时,我会看到具有不同键值的项目。键相同,但值相差几位数。

docClient scan succeeded: {
  "Items": [
    {
      "server_id": 558952579627876350,
      "getrole_post_id": 797525306164510700

dynamodb scan succeeded: {
  "Items": [
    {
      "server_id": {
        "N": "558952579627876353"
      },
      "getrole_post_id": {
        "N": "797525306164510740"

我只是想知道为什么我只使用一个表时会得到不同的值。倾向于正确的值是来自 dynamodb 而不是我看到大多数人使用的 docClient 的值。

编辑:我已将数据类型更改为表上的字符串,因此我将从 docclient 和 dynamodb 获得一致的结果,但仍然不确定为什么使用 datatype: number 时值不同。可能是从 int 到 bigint 或类似的错误转换。不确定。

【问题讨论】:

  • scan 不保证顺序,可能每次获取记录的顺序都不一样,我实在想不出每个客户端给出不同结果的任何原因。跨度>
  • 我关心的不是顺序,而是结果。我什至不知道 docClients 结果来自哪里,因为我只有一张表,其结果与 dynamodb 返回的结果相同。
  • 我看不出你在哪里说键是相同的 - 哪个字段是结果中的键?因为 server_id 和 getrole_post_id 都有不同的值。
  • 您可以在此处查看数据类型限制:docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
  • 这张表有多少项?在一次扫描中返回它们的数量是否足够少?如果没有,则需要根据需要进行分页,汇总结果,最后对结果进行排序比较。

标签: node.js amazon-web-services amazon-dynamodb


【解决方案1】:

这是节点限制。 DocumentClients 将 Dynamodb 类型映射到 Node 类型,在本例中为 N -> number。该值超出了准确性,因此您在解析过程中会丢失该信息。 DocumentClient 不支持这种情况,需要自己编写 Dynamodb 的解析 -> 节点类型

【讨论】:

【解决方案2】:

这里的问题似乎是 Python 的 float 实现和 boto3 选择 float 来表示 Number 属性的组合。

在 Python 中,如果将变量初始化为 558952579627876353 然后打印它,它的值是 558952579627876353。但是,如果您将变量初始化为浮点值558952579627876353.0 然后打印它,它的值是5.5895257962787635e+17 或实际上是558952579627876350。具体来说,它在...635 之后失去了精度,剩下的一切都变为零了。

同样,797525306164510740.0 变为 7.975253061645107e+17,实际上是 797525306164510700

我建议(正如您所做的那样)使用字符串作为 ID。另请参阅 boto/boto3/issues/665 了解上下文。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2022-01-24
    • 2014-03-16
    • 2021-08-26
    • 2021-04-03
    • 2019-07-25
    相关资源
    最近更新 更多