12

I have the following List example:

{
  "favorites": [
    {
      "createdAt": 1448998673852,
      "entityId": "558da3de395b1aee2d6b7d2b",
      "type": "media"
    },
    {
      "createdAt": 1448998789252,
      "entityId": "558da3de395b1aee2d6b7d83",
      "type": "media"
    },
    {
      "createdAt": 1448998793729,
      "entityId": "558da3de395b1aee2d6b7d99",
      "type": "media"
    },
    {
      "createdAt": 1448998813023,
      "entityId": "558da3de395b1aee2d6b7daf",
      "type": "media"
    }
  ],
  "userId": "2"
}

And I want to remove the Map with: "entityId": "558da3de395b1aee2d6b7d2b".

I am thinking an UpdateItem query, I have looked at REMOVE expression documentation (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html), but I can't seem to see any examples, beyond removing items from a List by index value....

Victor S
  • 5,098
  • 5
  • 44
  • 62

3 Answers3

2

I've run into this issue a few times now, and unfortunately there's no straightforward solution. The two most common workarounds I've come across are:

A. use a map instead of a list, you can reference the favorite directly in your update expression now using #favorites.#entityId. If order is important, add an order attribute to each map. In your data access layer is where you would need to do your conversions to/from the desired array type.

{
  "userId": "2",
  "favorites": {
    "558da3de395b1aee2d6b7d2b": {
      "createdAt": 1448998673852,
      "entityId": "558da3de395b1aee2d6b7d2b",
      "type": "media",
    },
    // ... more entities here
  }
}

B. use one-to-many tables instead, see http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForItems.html

Matty F
  • 3,763
  • 4
  • 30
  • 48
0

I have done this before in Python using the Boto3 library but not in Javascript. I have a link to the Javascript delete item function. What I did in Python was that I queried my table for the item(s) and make a list of the primary keys of the objects I wanted deleted and called the delete function.

kvdesai2
  • 75
  • 1
  • 7
-1

You should be de serializing the object into something you can work with, modifying it to remove that entry, then using update-item to save the changes.

I'm not a node.js user, but how did you create the object in the first place? Are you hand crafting the json string? If so you shouldn't be. There are libraries to handle json, and making it easy for you to modify them, and then get the resulting json string with the changes.

How to parse JSON using Node.js?

Community
  • 1
  • 1
srzdev
  • 202
  • 1
  • 2
  • 10
  • 2
    The problem with the approach suggested here is that it's not atomic. If two clients read the item around the same time, when they both write the item back, one of the changes is lost. – sheldonh May 18 '16 at 09:56
  • That doesn't answer the question of removing item from list in DynamoDB by a characteristic other than position in a list. – Juriy Nov 28 '16 at 00:51