从dynamoDB列表数据类型

时间:2016-08-25 09:40:56

标签: amazon-dynamodb nosql

高级要求:

  • 可能有数百万用户
  • 任何用户都可以喜欢其他用户
  • 需要存储用户的位置跟踪数据。最多需要存储100个最新数据点。

我正在考虑使用Dynamo DB来实现它,通过以下列格式存储数据(使用NOSQL的动机是快速的,因为在一次获取我将获得整个数据):

{
    "userID" : 2323423,
    "favs" :    [
            userIDA,
            userIDB,
            ...
    ],
    "lt" :  [
            {"timestamp1" : "coordinate1"},
            {"timestamp2" : "coordinate2"},
            ...
        ]
}

userID是主键。

查询要求是

  1. 应该可以添加删除收藏夹。
  2. 一堆新的时间戳< =>可能会出现GPS位置对,我需要将其输入到该用户的“lt”数据中。由于有100个LT数据点的限制,我也需要删除最旧的数据点。
  3. 我非常确定(1)使用List数据类型上的添加/删除API是直截了当的。 我如何解决查询(2)?如果UPDATE查询本身以某种方式迭代所有对象并删除旧的对象,那将是最好的。我已经读过Dynamo DB理解的列表中的索引是整数格式的,所以我们能以某种方式利用它吗?列表中的元素是否始终从0到N索引?如果是这样,我可以从数组的开头删除适当数量的元素。有没有办法做到这一点?

    我愿意使用不同的数据架构,但请让我知道整个推理以及如何解决这个问题。

1 个答案:

答案 0 :(得分:4)

1)属性“favs”应定义为SET数据类型,以便使用DELETE功能。请注意,您不能在LIST数据类型上使用DELETE。

删除操作符只能在SET上使用。

  

DELETE - 删除集合中的元素。

     

如果指定了一组值,则从中减去这些值   旧集。例如,如果属性值是集合[a,b,c]   并且DELETE操作指定[a,c],然后指定最终属性值   为B]。指定空集是一个错误。

     

DELETE操作仅支持设置数据类型。另外,DELETE   只能用于顶级属性,而不能用于嵌套属性。

2)要从LIST数据类型中删除事件(即Object),您应该知道索引。更新表达式可能如下所示: -

UpdateExpression:“REMOVE lt [0]” - 删除一个元素

UpdateExpression:“REMOVE lt [0] lt [1]” - 删除元素0和1

是的,对于LIST数据类型,索引从0到N开始。

3)有条件地删除项目 - 是的,您可以在ConditionExpression中包含条件。但是,REMOVE需要列表项的索引。否则,它将删除整个列表(即不是列表中的特定索引)。

此外,当您想在列表中引用MAP对象时,您需要列表索引。

示例: 要删除media.id = 3,条件和更新表达式应如下所述: -

请注意,索引用于条件表达式和更新表达式。

要删除“media.id”的JavaScript语法= 3: -

var params = {
        TableName : "Product",
        Key : {
            "product" : "IPhone 7+"
        },
        UpdateExpression : "REMOVE media[2]",   
        ConditionExpression: "media[2].id = :idvalue",      
        ExpressionAttributeValues: {":idvalue" : "3",
        },
        ReturnValues : "UPDATED_NEW"
    };

数据: -

"media": {
            "L": [{
                "M": {
                    "url": {
                        "S": "http://www.apple.com/iphone-6-plus/a.jpg"
                    },
                    "type": {
                        "S": "image"
                    },
                    "id": {
                        "S": "1"
                    }
                }
            }, {
                "M": {
                    "url": {
                        "S": "http://www.apple.com/iphone-6-plus/b.jpg"
                    },
                    "type": {
                        "S": "image"
                    },
                    "id": {
                        "S": "2"
                    }
                }
            }, {
                "M": {
                    "url": {
                        "S": "http://www.apple.com/iphone-6-plus/overvie
                        w.mp4 "
                    },
                    "type": {
                        "S": "video"
                    },
                    "id": {
                        "S": "3"
                    }
                }
            }]
        }