当前位置: 首页 > 面试题库 >

为什么使用Limit和FilterExpression进行DynamoDB扫描不返回符合过滤器要求的项目?

华飞驰
2023-03-14
问题内容

我需要在DynamoDB上进行限制和条件扫描。

该文件说:

在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果您发出的查询或扫描请求的限制值为6,并且没有过滤器表达式,则DynamoDB会返回表中与请求中指定的关键条件匹配的前六个项目(或仅返回前六个项目)。没有过滤器的扫描)。如果还提供FilterExpression值,则DynamoDB将在前六个中返回还与过滤器要求匹配的项目(返回的结果数将小于或等于6)。

代码(NODEJS):

var params = {
    ExpressionAttributeNames: {"#user": "User"},
    ExpressionAttributeValues: {":user": parseInt(user.id)},
    FilterExpression: "#user = :user and attribute_not_exists(Removed)",
    Limit: 2,
    TableName: "XXXX"
};

DynamoDB.scan(params, function(err, data) {
    if (err) {
        dataToSend.message = "Unable to query. Error: " + err.message;
    } else if (data.Items.length == 0) {
        dataToSend.message = "No results were found.";
    } else {
        dataToSend.data = data.Items;
        console.log(dataToSend);
    }
});

表XXXX的定义

  • 主分区键:用户(号码)
  • 主排序键:标识符(字符串)
  • 指数:
    • 索引名称:RemoveedIndex
    • 类型:GSI
    • 分区键:已删除(数字)
    • 排序键:-
    • 属性:ALL

在上面的代码中,如果删除该Limit参数,DynamoDB将返回与过滤器要求匹配的项目。因此,条件还可以。但是当我用Limit参数扫描时,结果为空。

XXXX表有5个项目。只有2首具有该Removed属性。当我不带Limit参数扫描时,DynamoDB返回3个不带Removed属性的项目。

我做错了什么?


问题答案:

从您引用的文档中:

如果还提供FilterExpression值,则DynamoDB将返回 前六项 中也符合过滤器要求的项目

通过组合Limit和FilterExpression,您已经告诉DynamoDB仅查看表中的前两个项目,并针对这些项目评估FilterExpression。DynamoDB中的限制可能会引起混淆,因为它的工作原理与limitRDBMS中的SQL表达式不同。



 类似资料:
  • 我需要在DynamoDB上做一个带限制和条件的扫描。 文件说: 在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果发出限制值为6且没有筛选器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件相匹配的前六项(或仅返回情况中的前六项)没有过滤器的扫描)。如果还提供了Filter表达式值,DynamoDB将返回前六项中也符合筛选要求的项(返回的结果数将小于或等于6)

  • 第一篇文章是关于Stack的,对于使用Python和DynamoDB编程来说,这是相当新的,但是我只是想在我的表上运行一个扫描,根据两个预定义的属性返回结果。 ---这是我的Python代码片段--- 我的发电机有4个磁场。 ID 日期 班次 安全 现在关于这个问题,在运行时,我得到了两个返回的表条目,而我应该只得到第一个条目...根据我的扫描标准,有“没有安全问题”的那个。 ---这是我的Dyn

  • 我正在尝试使用contains FilterExpression从AWS Dynamo DB scan获取数据。我正在使用以下参数,但收到的响应为空: {“Items”:[],“Count”:0,“ScannedCount”:792,“LastEvaluatedKey”:{“ID”:“b123456789”} 我想根据数组中的字符串进行过滤,例如:orange from fruits:['oran

  • 我注意到,在使用扫描仪时,如果我想设置定界符或区域设置等属性,那么这样做的方法会返回扫描仪对象本身: 我不明白的是,如果属性被更改(而不是创建新对象),为什么它返回一个扫描器对象而不是void?这并不是说我必须将返回值存储在一个变量中——事实上,如果我尝试这样做,就像下面的代码中那样,Eclipse将发出消息:“lineScanner”在此位置未关闭:

  • DynamoDb文档中指定的查询操作: 查询操作仅搜索主键属性值,并支持对键属性值的比较运算符子集以优化搜索过程。 和扫描操作: 扫描操作扫描整个表。您可以指定要应用于结果的过滤器,以在完成扫描后优化返回给您的值。 这是基于性能和成本考虑的最佳选择。

  • 问题:编写一个名为wordWrap的方法,该方法接受表示输入文件的扫描器作为其参数,并将文件的每一行输出到控制台,对超过60个字符的所有行进行文字包装。例如,如果一行包含112个字符,则方法应将其替换为两行:一行包含前60个字符,另一行包含最后52个字符。包含217个字符的行应该被包装成四行:三行的长度为60,最后一行的长度为37。 我的代码: 输出中的问题: 预期产出: 生产产量: 我哪里做错了