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

Dynamodb扫描()使用过滤器表达式

阙阳夏
2023-03-14

第一篇文章是关于Stack的,对于使用Python和DynamoDB编程来说,这是相当新的,但是我只是想在我的表上运行一个扫描,根据两个预定义的属性返回结果。

---这是我的Python代码片段---

shift = "3rd"
date = "2017-06-21"

if shift != "":
    response = table.scan(
        FilterExpression=Attr("Date").eq(date) and Attr("Shift").eq(shift)
    )

我的发电机有4个磁场。

  1. ID
  2. 日期
  3. 班次
  4. 安全

现在关于这个问题,在运行时,我得到了两个返回的表条目,而我应该只得到第一个条目...根据我的扫描标准,有“没有安全问题”的那个。

---这是我的DynamoDB返回结果---

[
  {
    "Shift": "3rd",  
    "Safety": "No safety issues",  
    "Date": "2017-06-21",
    "ID": "2"
  }, 
  {
    "Shift": "3rd", 
    "Safety": "Cut Finger", 
    "Date": "2017-06-22", 
    "ID": "4"
  }
]

返回的项目: 2

我相信,通过应用具有逻辑'和'指定的筛选表达式,扫描操作正在寻找符合两个标准的条目,因为我使用了'和'。

这可能是因为在两个条目中都找到了“shift”属性“3rd”?我如何确保它返回的条目基于两个条件都满足,而不仅仅是一个属性类型的结果?

我有一种感觉,这很简单,但我已经看了可用的留档:http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#DynamoDB.Table.scan,仍然有麻烦。任何帮助将不胜感激!

P. S.我试图保持帖子简单易懂(不包括我所有的程序代码),但是,如果需要额外的信息,我可以提供它!

共有3个答案

谭灿
2023-03-14

使用上述每个答案中的部分,这里有一个简洁的方法,我可以让它工作:

from functools import reduce
from boto3.dynamodb.conditions import Key, And

response = table.scan(FilterExpression=reduce(And, ([Key(k).eq(v) for k, v in filters.items()])))

允许在中的多个条件下进行筛选,将筛选为法规。例如:

{
    'Status': 'Approved', 
    'SubmittedBy': 'JackCasey'
}
左丘宜年
2023-03-14

Dynamodb扫描()使用过滤器表达式

对于多个过滤器,可以使用以下方法:

import boto3
from boto3.dynamodb.conditions import Key, And

filters = dict()
filters['Date'] = "2017-06-21"
filters['Shift'] = "3rd"

response = table.scan(FilterExpression=And(*[(Key(key).eq(value)) for key, value in filters.items()]))
鲍俊杰
2023-03-14

这是因为在表达式中使用了Python的关键字,而不是

如果ab都被认为是Truea和b返回后者,b

>>> 2 and 3
3

如果其中任何一个是False,或者如果两个都是,则返回第一个False对象:

>>> 0 and 3
0
>>> 0 and ''
0
>>> 

一般规则是,返回第一个对象,该对象允许它确定整个表达式的真实性。

Python对象在布尔上下文中总是被认为是True。所以,你的表情:

Attr("Date").eq(date) and Attr("Shift").eq(shift)

将作为最后一个True对象进行计算,即:

Attr("Shift").eq(shift)

这就解释了为什么你只在轮班时过滤。

你需要使用

因此,必须使用“按位and”:

FilterExpression=Attr("Date").eq(date) & Attr("Shift").eq(shift)

根据文件,,

您还可以使用逻辑运算符将条件链接在一起:

 类似资料:
  • 我已经在该表上创建了DynamoDB表和全局辅助索引。我需要从该表的GSI中获取所有数据。 有两种选择: 无筛选表达式的扫描操作 我需要找出哪一个性能更好,以便我开始我的实现。 我已经读了很多关于DynamoDB扫描和查询操作,但可以解决我的查询。 请帮我解决我的问题。 提前谢谢。 阿披实

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

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

  • 我必须建立一个应用程序,扫描BLE设备,并返回它的数据。扫描时设备不会显示,除非我使用过滤器。 UUID 不是一个选项,设备不会广播其名称(使用 扫描时会显示 N/A。 我正在尝试按MAC地址扫描它。但是,我不知道MAC地址,因为它可以是任何类型的设备,所以应用程序之前不会知道设备的MAC地址。 我已经知道设备的地址上有一个前缀,即。问题是后缀。我如何(如果可能的话)制作一个正则表达式作为参数传递

  • 这是我的用例: 我有一个带有200k对象的JSON Api。数据集看起来有点像这样:日期、自行车型号、以分钟为单位的生产时间。我使用Lambda从JSON Api中读取并通过超文本传输协议请求在DynamoDB中写入。Lambda函数每天运行并使用最新数据更新DynamoDB。 然后,我按日期检索数据,因为我想计算每天的平均生产时间,并将其放在第二个表中。Alexa技能连接到第二个表,并读取每天的

  • 我们有一个设置,其中各种工作节点执行计算并更新DynamoDB表中的相对状态。该表充当工作节点活动的一种历史记录。看门狗节点需要定期扫描表,并构建一个表示工作节点及其作业的当前状态的对象。因此,我们的应用程序能够扫描表并按时间顺序检索数据(即按时间戳排序)是很重要的。表最终会太大,无法扫描到本地内存进行后期排序,所以我们扫描后无法排序。 从AWS留档读取主键: DynamoDB使用分区键值作为内部