Amazon dynamodb 列出Dynamodb在boto3中的FilterExpression中的理解
所以我在dynamodb的数据库中有一些项目,它看起来有点像这样,其中name是主键Amazon dynamodb 列出Dynamodb在boto3中的FilterExpression中的理解,amazon-dynamodb,boto3,nosql,Amazon Dynamodb,Boto3,Nosql,所以我在dynamodb的数据库中有一些项目,它看起来有点像这样,其中name是主键 'name': {'S': 'bob'}, 'users': {'L': [ {'M': { 'user_id': {'S': 'xxx'}, 'share': {'N': '1'}}}, {'M': { 'user_id': {'S': 'yyy'}, 'share': {'N': '4'}}}]} 现在我的问题是,用户是一个字
'name': {'S': 'bob'},
'users': {'L': [
{'M': {
'user_id': {'S': 'xxx'},
'share': {'N': '1'}}},
{'M': {
'user_id': {'S': 'yyy'},
'share': {'N': '4'}}}]}
现在我的问题是,用户是一个字典列表,我想知道当用户列表中有一个特定的用户id
时,是否有任何方法可以扫描该表以获取名称
我知道在python中,我会做一个列表理解,得到一个user\u id
的列表,然后在[user['user\u id']for user in users]
中做一个user\u id,这将是一个测试,但我不确定在DynamoDB扫描filtereexpression
中如何做
我只是想避免让物品看起来像这样:
'name': {'S': 'bob'},
'users': {'L': [
{'M': {
'user_id': {'S': 'xxx'},
'share': {'N': '1'}}},
{'M': {
'user_id': {'S': 'yyy'},
'share': {'N': '4'}}}]}
'user_ids': {'L': [
{'S': 'xxx'},
{'S': 'yyy'}]}
因为它感觉像一种所谓的“代码气味”。但这将解决问题,因为筛选表达式只是:user\u id中的user\u id
DynamoDB没有过滤列表数据类型中映射中存在的数据的功能。用户列表具有用户id和共享属性。如果您知道用户id和共享的值,则可以使用CONTAINS
运算符筛选数据
请注意,正如您在OP中提到的,DynamoDB中的in操作符不能这样使用。请参见下面的描述
IN:检查两个集合内的匹配元素
AttributeValue列表可以包含一个或多个String类型的AttributeValue元素,
数字或二进制(不是集合类型)。比较这些属性
针对项的现有集合类型属性。如果有任何元素
输入集存在于项属性中,即表达式
计算结果为true
DynamoDB没有过滤列表数据类型中映射中存在的数据的功能。用户列表具有用户id和共享属性。如果您知道用户id和共享的值,则可以使用CONTAINS
运算符筛选数据
请注意,正如您在OP中提到的,DynamoDB中的in操作符不能这样使用。请参见下面的描述
IN:检查两个集合内的匹配元素
AttributeValue列表可以包含一个或多个String类型的AttributeValue元素,
数字或二进制(不是集合类型)。比较这些属性
针对项的现有集合类型属性。如果有任何元素
输入集存在于项属性中,即表达式
计算结果为true
如果我没有share
值,就没有办法这样做吗?还感谢您提供有关IN运算符的说明。我不知道!不幸的是,没有办法。如果我没有共享
值,就没有办法这样做吗?还感谢您提供有关IN运算符的说明。我不知道!不幸的是,没有办法。
var params = {
TableName: "tablenames",
FilterExpression: "contains (#users, :usersDetails)",
ExpressionAttributeNames: { '#users' : 'users'},
ExpressionAttributeValues: {
":usersDetails": {'user_id' : 'xxx', 'share' : 1}
}
};