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

Amazon dynamodb 从dynamoDB列表数据类型中删除前几个条目,amazon-dynamodb,nosql,Amazon Dynamodb,Nosql,高级别要求: 可能有数百万用户 任何用户都可以喜欢其他用户 需要存储用户的位置跟踪数据。最多必须存储100个最新数据点 我正在考虑使用Dynamo DB来实现这一点,方法是将数据存储为以下格式(使用NOSQL的动机是快速检索,因为在一次get中,我将获得整个数据): userID是主键 查询要求如下: 应该可以添加或删除收藏夹 可能会出现一组新的时间戳GPS位置对,我需要将它们输入到用户的“lt”数据中。由于有100个LT数据点的限制,我也需要删除最旧的数据点 我非常确定(1)是直接使用列表

高级别要求:

  • 可能有数百万用户
  • 任何用户都可以喜欢其他用户
  • 需要存储用户的位置跟踪数据。最多必须存储100个最新数据点
我正在考虑使用Dynamo DB来实现这一点,方法是将数据存储为以下格式(使用NOSQL的动机是快速检索,因为在一次get中,我将获得整个数据):

userID是主键

查询要求如下:

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

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

    1)属性“favs”应该定义为SET data type,以便使用DELETE功能。请注意,不能对列表数据类型使用“删除”

    删除运算符只能在集合上使用

    删除-从集合中删除元素

    如果指定了一组值,则从中减去这些值 旧的一套。例如,如果属性值是集合[a、b、c] 删除操作指定[a,c],然后是最终属性值 是[b]。指定空集是一个错误

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

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

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

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

    是,列表数据类型的索引从0到N开始

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

    另外,当您想要引用列表中的映射对象时,您需要列表的索引

    示例: 要删除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"
                        }
                    }
                }]
            }
    
    数据:-

    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"
                        }
                    }
                }]
            }
    

    谢谢你。另一个查询是,如果“lt”列表中的每个条目都映射有时间戳和坐标的键值对,是否可以从“lt”列表中删除旧条目?{“timestamp”:234243434,“coord”:“2.34435,0.3342343”}因此,通过扫描表格,删除“lt”中时间戳早于某个值的列表项?这肯定有帮助。您能告诉我是否可以在没有条件表达式的情况下向列表中添加元素,并使用条件表达式列表一次性删除列表中的过时条目吗?恐怕没有,我只是想确认一下。我不想最后写一个cron来扫描并删除过时的条目(这不是太多了吗)。我可以保留100个左右的数据点用于位置跟踪。希望您能提供帮助。我可以运行一个查询,将另一个坐标条目附加到我的位置跟踪“lt”列表中,以添加到我以前的注释中。是否有一种方法可以删除列表中与条件表达式匹配的所有条目?如果我必须单独运行此查询,则可以。我的动机是删除“lt”列表中时间戳已过期(超过2天)或类似内容的过时条目。好的,我的上一个查询如何,我可以删除列表中与条件表达式匹配的所有条目吗?谢谢,你能给我一个示例,其中列表可能有以下数据点:{“timestamp”:234243434,“coord”:“2.34435,0.3342343”}我想删除时间戳小于X的列表项?