从 dynamoDB 列表数据类型中删除前几个条目

Our*_*ros 2 nosql amazon-dynamodb

高级要求:

  • 可能有数百万用户
  • 任何用户都可以收藏另一个用户
  • 需要存储用户的位置跟踪数据。最多必须存储 100 个最近的数据点。

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

{
    "userID" : 2323423,
    "favs" :    [
            userIDA,
            userIDB,
            ...
    ],
    "lt" :  [
            {"timestamp1" : "coordinate1"},
            {"timestamp2" : "coordinate2"},
            ...
        ]
}
Run Code Online (Sandbox Code Playgroud)

userID 是主键。

查询要求是

  1. 添加删除收藏夹应该是可能的。
  2. 可能会出现一堆新的时间戳 <=> GPS 位置对,我需要将其输入到该用户的“lt”数据中。由于有 100 个 LT 数据点的限制,我也需要删除最旧的数据点。

我很确定 (1) 是直接使用 List 数据类型上的添加/删除 API。如何解决查询 (2)?如果 UPDATE 查询本身能够以某种方式迭代所有对象并删除旧的对象,那将是最好的。我已经读过 Dynamo DB 所理解的列表中的索引是整数格式,那么我们可以以某种方式利用它吗?列表中的元素是否总是从 0 到 N 索引?如果是这样,我可以从数组的开头删除适当数量的元素。有什么办法吗?

我愿意使用不同的数据模式,但请让我知道整个推理以及如何解决。

not*_*est 5

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

Delete 运算符只能用于 SET。

DELETE - 从集合中删除一个元素。

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

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

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

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

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

是的,LIST 数据类型的索引从 0 到 N。

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

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

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

请注意,条件表达式和更新表达式中都使用了索引。

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

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

数据:-

"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"
                    }
                }
            }]
        }
Run Code Online (Sandbox Code Playgroud)