2017-06-22 170 views
1

首先发布在Stack上,对于使用Python进行编程和使用DynamoDB相当新颖,但我只是试图在基于两个预定义属性返回结果的表上运行扫描。使用FilterExpression进行Dynamodb扫描()使用FilterExpression进行Dynamodb扫描()

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

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

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

我DynamoDB有4个领域。

1)ID

2)日期

3)移位

4)安全

DynamoDB Pic

现在的问题,一旦运行,我获得两个表当我只能得到第一个条目时才返回条目......基于我的扫描条件的“没有安全问题”的条目。

---这是我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

我相信,通过与指定的扫描操作是逻辑“与”应用FilterExpression寻找符合BOTH标准的条目,因为我使用'和'。

难道这是因为在两个条目中都找到了'shift'属性“3rd”吗?我如何确保它根据满足的BOTH标准返回条目,而不仅仅是给我一个属性类型的结果?

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

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

回答

0

这是因为您在表达式中使用了Python的and关键字,而不是&运算符。

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

>>> 2 and 3 
3 

如果它们中的任何是False,或者如果两者都是,则返回所述第一False对象:

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

一般规则是,and返回第一个对象,它允许它决定整个ex的真实性压力。

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

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

将评估作为最后True对象,即:

Attr("Shift").eq(shift) 

这就解释了为什么你只上移过滤。

您需要使用&运算符。它通常意味着Python中的整数之间的“位和”,它被重新定义为Attr对象意味着你想要的:“两种条件”。

所以,你必须使用:

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

the documentation

你也能链条件一起使用逻辑 运营商:&(和),| (或)和〜(不)。

+0

谢谢你的解释!我现在明白了! – Torbyn