【问题标题】:AWS DynamoDB Node.js scan- certain number of resultsAWS DynamoDB Node.js 扫描 - 一定数量的结果
【发布时间】:2016-06-20 17:21:34
【问题描述】:

我尝试使用 lambda AWS 从 DynamoDB 中获取满足条件的前 10 个项目。我试图使用 Limit 参数,但它是(基于该网站)

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#scan-property

“要评估的最大项目数(不一定是匹配项目的数量)”。

如何获得满足我条件的前 10 个项目?

var AWS = require('aws-sdk');
var db = new AWS.DynamoDB();

exports.handler = function(event, context) {

  var params = {
    TableName: "Events", //"StreamsLambdaTable",
    ProjectionExpression: "ID, description, endDate, imagePath, locationLat, locationLon, #nm, startDate, #tp, userLimit",  //specifies the attributes you want in the scan result.
    FilterExpression: "locationLon between :lower_lon and :higher_lon and locationLat between :lower_lat and :higher_lat",
    ExpressionAttributeNames: {
        "#nm": "name",
        "#tp": "type",
    },
    ExpressionAttributeValues: {
        ":lower_lon": {"N": event.low_lon},
        ":higher_lon": {"N": event.high_lon}, //event.high_lon}
        ":lower_lat": {"N": event.low_lat},
        ":higher_lat": {"N": event.high_lat}
    }
};

  db.scan(params, function(err, data) {
    if (err) {
      console.log(err); // an error occurred
      } 
    else {
      data.Items.forEach(function(record) {
           console.log(
                record.name.S + "");
        });
        context.succeed(data.Items);


      }
  });
};

【问题讨论】:

  • 你试过什么?你的代码是什么样的?您收到任何错误消息吗?
  • 我的代码没有问题。我只是不知道如何解决这个问题。以防万一我把它包括在我的问题中。
  • 我试过了,它评估前 10 个项目并返回少于 10 个(仅满足条件的项目)
  • 您要么需要无限制地执行查询,并使用前10个结果并忽略其余结果,要么如果第一个结果集小于10,则使用LastEvaluatedKey获取更多结果。
  • 什么更有效率?我大概会存储数千个项目。

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


【解决方案1】:

我想您已经知道这背后的原因:DynamoDB 对ScannedCountCount 的区别。根据this

ScannedCount — 被查询或扫描的项目数, 在将任何过滤器表达式应用于结果之前。

计数—— 响应中返回的项目数。

对此的修复记录在此上方:

对于 Query 或 Scan 操作,如果操作未返回表中的所有匹配项,则 DynamoDB 可能会返回 LastEvaluatedKey 值。要获取匹配项的完整计数,请从上一个请求中获取 LastEvaluatedKey 值,并将其用作下一个请求中的 ExclusiveStartKey 值。重复此操作,直到 DynamoDB 不再返回 LastEvaluatedKey 值。

因此,您的问题的答案是:使用来自 DynamoDB 响应的 LastEvaluatedKey 并再次使用 Scan

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多