如何从 DynamoDB 中的地图列表中删除(必须是原子的)

Mom*_*ias 5 amazon-dynamodb

我有这个架构:

{
   product: S // Primary Key, // my Hash
   media: L // List of Maps
}
Run Code Online (Sandbox Code Playgroud)

每个媒体项目将是这样的:

[
   { 
      id: S, // for example: id: uuid()
      type: S, // for example: "image"
      url: S // for example: id: "http://domain.com/image.jpg"
   }
]
Run Code Online (Sandbox Code Playgroud)

样本数据:

{
    product: "IPhone 6+",
    media: [
        {
            id: "1",
            type: "image",
            url: "http://www.apple.com/iphone-6-plus/a.jpg"
        },
        {
            id: "2",
            type: "image",
            url: "http://www.apple.com/iphone-6-plus/b.jpg"
        },
        {
            id: "3",
            type: "video",
            url: "http://www.apple.com/iphone-6-plus/overview.mp4"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我希望能够通过 id 从媒体列表中删除。类似于:“从产品:‘IPhone 6+’,删除 ID 为‘2’的媒体”

查询后,数据应该是这样的:

{
    product: "IPhone 6+",
    media: [
        {
            id: "1",
            type: "image",
            url: "http://www.apple.com/iphone-6-plus/a.jpg"
        },
        {
            id: "3",
            type: "video",
            url: "http://www.apple.com/iphone-6-plus/overview.mp4"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我应该如何表达这样的查询?我在 UpdateItem 上看到了一个帖子,但我找不到这个查询类型的好例子。

谢谢!

not*_*est 5

不幸的是,API 没有这个功能。如果您知道索引,您可以做的最接近的是从“列表”数据类型中删除条目。

我知道大多数时候索引可能不可用。但是,如果您没有任何其他解决方案,可以查看此替代选项。

您还需要了解,即使 DynamoDB 开始支持 List、Map 和 Set 等 Document 数据类型,您也无法执行某些操作。API 中尚未添加某些功能。我相信这个场景就是其中之一。

我已使用REMOVE从列表中删除该项目。

var params = {
        TableName : "Product",
        Key : {
            "product" : "IPhone 6+"
        },
        UpdateExpression : "REMOVE media[0]",       
        ReturnValues : "UPDATED_NEW"
    };

console.log("Updating the item...");
docClient.update(params, function(err, data) {
    if (err) {
        console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("UpdateItem succeeded:", JSON.stringify(data));
    }
});
Run Code Online (Sandbox Code Playgroud)

仅供参考:-

Delete 运算符只能用于 SET。

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

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

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