【问题标题】:NodeJs: not returning correct count fo Dynamodb table节点 Js:没有返回正确的 Dynamodb 表计数
【发布时间】:2021-03-01 23:44:28
【问题描述】:

我有以下代码:

const AWS = require("aws-sdk");
AWS.config.update({region: 'us-eas-1'});
var ddb = new AWS.DynamoDB({region: 'us-east-1'});

async function countData(){
     var params ={TableName: 'tbl_billings_trns'}
     const countdb1 =  await ddb.describeTable(params).promise();
     console.log(countdb1);
    console.log("Total count " + numbers.toString());
     return numbers;
      
  }

countData()

我也试过了:

async function kk(){
var jj = await countData();
console.log(jj);
}

kk()

计数为 0,但 Table 有 12 个项目。

我在promisify后使用了await,但无法实现。任何帮助都会对我有很大帮助。

【问题讨论】:

  • numbers 来自哪里?您在哪里尝试从 countdb1 获取计数?
  • 1.它来自表,但表已经有 12 个项目 2. 在 index.handler 的异步默认方法中的 lambda 中

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


【解决方案1】:

您正在使用DescribeTable API 调用来获取项目数。

根据docs,这实际上不是实时计数:

ItemCount

指定表中的项目数。 DynamoDB 大约每六个小时更新一次此值。最近的更改可能不会反映在此值中。

您收到的数据可能长达 6 小时,这可能是它不匹配的原因。

要获得更准确的数字,您必须扫描表格,这非常昂贵,您真的应该避免。

【讨论】:

  • 感谢 Maurice 的宝贵回复,这让我抓狂......async await 适用于所有其他 SDK api 方法,但不适用于此
  • 去过那里,做到了 ;-) - 经验法则:您从 API 获得的任何大规模检索代价高昂的值都可能不存在。
  • 是的,实际上取决于该值,如果 itemcount 大于 0,我想调用另一个 lambda 现在不知道如何在节点 js lambda 中执行此操作
  • 如果是这种情况,你可以做一个限制为 1 的扫描,这仍然相当便宜。
【解决方案2】:

如果您的应用程序需要获取更准确的聚合,您可以考虑在 DynamoDB 中自己维护计数。例如,如果您需要保留用户/产品/订单/等的计数,您可以维护一个摘要记录,当您从表中添加/删除项目时,该记录会增加/减少。如果您的应用程序具有需要聚合的报告机制,否则这将特别有用,否则只能通过昂贵的扫描操作获得。

维护您自己的摘要记录的一种常见模式是使用 DynamoDB 流。当您的 lambda 收到有关新项目或已删除项目的通知时,您可以相应地更新摘要记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多