Boto3:使用' NOT IN'用于在DynamoDB中扫描

时间:2018-05-16 12:28:47

标签: python-3.x amazon-dynamodb boto3

我设法制作了一个过滤表达式,用于过滤来自Scan的项目。 Smth喜欢:

users = [1, 2, 3]
table.scan(
    FilterExpression=Attr('user_id').is_in(users) 
)

我可以以某种方式将其从过滤转换为排除,因此除了带有ID 1,2,3的用户外,我将获得所有用户。

2 个答案:

答案 0 :(得分:1)

到目前为止,我找到的唯一方法是使用boto3.client而不是表和低级语法。像这样的Smth:

lst_elements = ''
attr_elements = {}
for id in user_ids:
    lst_element += 'user' + str(id)
    attr_elements['user' + str(id)] = id

client.scan(
    TableName='some_table_name',
    FilterExpression="NOT (user_id IN ({}))".format(lst_element[:-1]),
    ExpressionAttributeValues=attr_elements
)

这个解决方案适合我,但看起来很复杂。因此,如果您知道更好的方法,请添加您的答案。

答案 1 :(得分:0)

您可以使用~运算符轻松完成此操作:

users = [1, 2, 3]
table.scan(
    FilterExpression=~Attr('user_id').is_in(users)
)

检查__invert__触发的condition.py~的重载实现。