在dynamodb aws中搜索列表数据类型

Search in list data type in dynamo db aws

我们正在使用 dynamo db 作为我们网站之一的数据库解决方案。我们按照下面给定的 json.

将数据存储在发电机数据库中

我们有属于one/many流派的视频,所以我们选择了列表数据类型并将数据存储到其中,并将流派制作为GSI(全球二级索引)

我面临几个问题。

1) 当我将genre定义为索引时,aws只提供了三种数据类型(字符串、二进制、数字),不允许我们存储列表类型的数据。它给出了意外的数据类型错误。

2) 如果我不定义为索引,则不允许获取数据。 DynamoDB 要求哈希键,这在我的情况下是不可能的,因为我正在获取不应依赖于哈希键(主键)的列表。

{
  "description": "********",
  "genre": [
    "Kids",
    "Documentary"
  ],
  "language": "******",
  "status": "0",
  "thumb_url": "******",
  "title": "******",
  "uploaded_by": "****** ",
  "url": "******",
  "video_id": 1330051052
}

获取数据的代码

$DynamoDbClient = AWS::get('DynamoDb');
        $result = $DynamoDbClient->query(array(
            'TableName' => 'videos',
            'IndexName' => 'genre-index',
            'AttributesToGet' => array('video_id', 'language', 'description'),
            'KeyConditions' => array(
                // Key attribute
                // This is non-key attribute
                'genre' => array(
                    'ComparisonOperator' => 'EQ',
                    'AttributeValueList' => array(
                        array("S" => "Kids"),
                    )
                ),
            ),
        ));

在上面的代码中,我正在寻找儿童类型的视频。但它 returns 空白,如果我不将流派声明为索引,则会出错。同一个视频可以属于多个流派。

那么我是否可以在列表中搜索,或者我没有以正确的方式使用 API?始终感谢您的帮助。

关于 NoSQL 的一个问题是它并不适用于所有地方,但我的客户也遇到过类似情况,这是我的解决方案:

videoMaster (videoId(hash), desc, link ..etc)
tagDetail (tagId(hash), videoId(Range))

现在可以通过tagId(kids, study..etc) 查询得到特定标签的所有视频

您在 tagDetail 中的数据类似于:

kids -> video1
kids -> video2
Education -> video1
Education -> video3

上述解决方案的问题:如果您在一个特定标签中有数十亿个视频,那么您的性能将受到影响,因为哈希分布不正确。

小提示:你可以为你的table读取实现缓存机制,这样你就不必每次都查询你的数据库了。