Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Remove from List Of Maps in DynamoDB (Must be Atomic)

I have this Schema:

{
   product: S // Primary Key, // my Hash
   media: L // List of Maps
}

Each media item will be like this:

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

Sample Data:

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

I want to be able to remove from media list by id. Something like: "From product: 'IPhone 6+', remove the media with id: '2'"

After the query, the Data should be like this:

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

How should i express query like this? I saw a post on UpdateItem but i can't find a good example for this query type.

Thanks!

like image 996
Momos Morbias Avatar asked Aug 18 '16 09:08

Momos Morbias


1 Answers

Unfortunately, the API doesn't have this feature. The closest you can do is to delete an entry from "List" data type if you know the index.

I understand that most of the time the index mayn't be available. However, you can take a look at this alternate option if you don't have any other solution.

You also need to understand that even though DynamoDB started supporting the Document data types such as List, Map and Set, you can't perform some actions. Some features are yet to be added in the API. I believe this scenario is one of them.

I have used REMOVE to delete the item from list.

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));
    }
});

This is just for your reference:-

The Delete operator can be used only on SET.

DELETE - Deletes an element from a set.

If a set of values is specified, then those values are subtracted from the old set. For example, if the attribute value was the set [a,b,c] and the DELETE action specifies [a,c], then the final attribute value is [b]. Specifying an empty set is an error.

The DELETE action only supports set data types. In addition, DELETE can only be used on top-level attributes, not nested attributes.

like image 149
notionquest Avatar answered Nov 10 '22 14:11

notionquest