首页 文章

Dynamodb scan()使用FilterExpression

提问于
浏览
1

首先发布在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)
    )

我的DynamoDB有4个字段 .

  • ID

  • 日期

  • 转变

  • 安全

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”吗?如何确保它根据满足的两个条件返回条目,而不仅仅是从一个属性类型给我结果?

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

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

1 回答

  • 1

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

    如果 ab 都被视为 True ,则 a and b 返回后者, b

    >>> 2 and 3
    3
    

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

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

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

    Python对象在布尔上下文中始终被视为 True . 所以,你的表达:

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

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

    Attr("Shift").eq(shift)
    

    这解释了为什么你只过滤了班次 .

    您需要使用 & 运算符 . 它通常意味着Python中的整数之间的"bitwise and",它被重新定义为Attr对象意味着你想要的:"both conditions" .

    所以你必须使用“按位和”:

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

    根据the documentation

    您还可以使用逻辑运算符将条件链接在一起:&(和),| (或),和〜(不) .

相关问题