Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon dynamodb 列出Dynamodb在boto3中的FilterExpression中的理解_Amazon Dynamodb_Boto3_Nosql - Fatal编程技术网

Amazon dynamodb 列出Dynamodb在boto3中的FilterExpression中的理解

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'}}}]} 现在我的问题是,用户是一个字

所以我在dynamodb的数据库中有一些项目,它看起来有点像这样,其中name是主键

'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}

        }
};