在dynamo db aws中搜索列表数据类型

时间:2015-12-17 10:53:50

标签: amazon-web-services amazon-dynamodb aws-sdk

我们正在使用dynamo db作为我们其中一个站点的数据库解决方案。我们将数据存储在dynamo db中,如下面给出的json。

我们有可以属于一个/多个类型的视频,因此我们选择了列表数据类型并将数据存储到其中并使该类型成为GSI(全球二级索引)

我正面临几个问题。

1)当我将类型定义为索引时,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"),
                    )
                ),
            ),
        ));

在上面的代码中,我正在寻找儿童类型的视频。但如果我不将类型声明为索引,则返回空白并给出错误。同一视频可以属于多种类型。

那么无论如何我可以在列表中搜索或者我是否以正确的方式使用API​​?总是感谢帮助。

1 个答案:

答案 0 :(得分:2)

关于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

上述解决方案存在问题:如果您在一个特定代码中包含数十亿个视频,那么由于哈希未正确分发,您的效果会受到影响。

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