当前位置: 首页 > 知识库问答 >
问题:

为什么DynamoDB扫描与限制和过滤器表达式不返回符合过滤器要求的项目?

姚德容
2023-03-14

我需要在DynamoDB上做一个带限制和条件的扫描。

文件说:

在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果发出限制值为6且没有筛选器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件相匹配的前六项(或仅返回情况中的前六项)没有过滤器的扫描)。如果还提供了Filter表达式值,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定义:

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


    在上面的代码中,如果我删除Limit参数,DynamoDB将返回符合过滤器要求的项目。所以,条件是好的。但是当我用Limit参数扫描时,结果是空的。

    XXXX表,有5项。只有2个第一个具有Remved属性。当我在没有Limit参数的情况下扫描时,DynamoDB返回3个没有Remved属性的项。

    我做错了什么?

共有3个答案

湛文乐
2023-03-14

通过使用二级索引,您可能可以获得所需的内容。使用经典的RDB示例,客户订单html" target="_blank">示例:您有一个表用于客户,一个表用于订单。Orders表有一个键,由Customer-HASH、Order-RANGE组成。所以如果你想得到最近的10份订单,没有扫描是不可能的

但是,如果您根据“某个常量”(散列、日期范围)的顺序创建一个全局二级索引,并根据该索引进行查询,则查询将执行您想要的操作,并且只向您收取与返回的记录相关的RCU的费用。不需要昂贵的扫描。注意,写操作会更昂贵,但在大多数情况下,读操作要比写操作多得多。

现在,如果你想在超过1000美元的一天内获得最大的10个订单,你就有了最初的问题。查询将返回最后10个订单,然后过滤掉那些低于1000美元的订单。

在本例中,您可以创建一个Date OrderAmount的计算键,对该索引的查询将返回您想要的结果。

这不像SQL那么简单,但是您也需要考虑SQL的访问模式。如果你有很多数据,你需要在SQL中创建索引,否则数据库会很乐意代表你进行表扫描,这将损害性能并提高成本。

请注意,我提出的一切都是规范化的,因为真理只有一个来源。您并不是在复制数据--您只是在重铸它的视图,以便从DynamoDB获得所需的数据。

请记住,作为散列的常量受每个分区10GB的限制,因此如果有大量活动数据,则需要围绕它进行设计。例如,根据预期的访问模式,可以使用Customer而不是常量作为散列。或者使用流以其他方式组织数据(或子集)。

仇飞鹏
2023-03-14

也遇到了这个问题,我猜你只需要扫描整个表到最大1MB

扫描每次调用的扫描结果集限制为1 MB。您可以使用扫描响应中的LastEvaluatedKey检索更多结果。

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html

丁高峯
2023-03-14

从您引用的文档中:

如果还提供FilterExpression值,DynamoDB将返回前六个中也符合筛选器要求的项

通过结合Limit和FilterExpress,您已经告诉DynamoDB只查看表中的前两个项目,并根据这些项目评估Filter表达式。DynamoDB中的限制可能会令人困惑,因为它的工作原理不同于RDBMS中SQL表达式中的限制。

 类似资料:
  • 问题内容: 我需要在DynamoDB上进行限制和条件扫描。 该文件说: 在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果您发出的查询或扫描请求的限制值为6,并且没有过滤器表达式,则DynamoDB会返回表中与请求中指定的关键条件匹配的前六个项目(或仅返回前六个项目)。没有过滤器的扫描)。如果还提供FilterExpression值,则DynamoDB将在前六个中返回还与过滤器要

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

  • 我正在Android(移动设备a)上执行UUID过滤扫描,我有两个测试用例。 一个人在另一个Android设备(移动设备b)上使用一个名为BLE扫描仪的应用程序来创建一个具有两个测试服务的BLE服务器(每个服务都有自己唯一的UUID)。另一种是通过Arduino BLE服务器,为其服务定制UUID。 如果我使用移动设备B的BLE扫描仪应用程序并扫描arduino,我可以找到它,连接到它并查看服务以

  • 我从事elasticsearch,我尝试混合两个工作查询。第一个是“and filter”,第二个是“bool filter”,但我失败了。 我的查询是从用户交互界面动态生成的。 “和过滤器”: 我需要“和过滤器”来查询数据,例如,字段必须等于“非洲”或“亚洲”或为空。这是一个工作查询的示例: 此查询工作正常,结果如下: 现在我需要用字段“D\u TYPESTATUS”来限制结果数据,该字段必须与

  • 我正试图在我的RecyclerView中实现搜索过滤器,就像在这篇文章中一样 我已经对它进行了调试,它确实按照预期过滤了项目,但列表在应用程序中似乎没有改变。一、 E:我过滤一个名字,有7个结果,在屏幕上是原始列表。 我的 onCreateMenu活动选项是: 我的适配器如下所示: 我忘了什么? 提前致谢!

  • 过滤表达式 mitmproxy工具中的许多命令都使用过滤器表达式。过滤器表达式由以下运算符组成: 命令 描述 〜a 匹配响应资源:CSS,Javascript,Flash,images。 〜b regex Body 〜bq regex 请求的Body 〜bs regex 响应的Body 〜c int HTTP响应码 〜d regex 域名 〜dst regex 匹配目标地址 〜e 匹配错误 〜h