How to return the inserted item in dynamoDB

24,274

Solution 1

The link you posted is, sadly, the only real answer at this time (API Version 2012-08-10). PutItem may return items just before they were updated or none at all.

The ReturnValues parameter is used by several DynamoDB operations; however, PutItem does not recognize any values other than NONE or ALL_OLD.

In short, the only reliable way to retrieve your inserted object is to GetItem, just as you surmised.

Solution 2

Just pass the params.Item in the callback :

 dynamo.put(params, (err, data) => {
        if (err) {
          cb(err);
        }
        cb(null, params.Item);
      });

Pass the err in the callback too ;)

Solution 3

You can use UpdateItem instead of PutItem. UpdateItem creates a new item if it doesn't exist already, plus you can set ReturnValues to ALL_NEW to return the whole item as it appears in the database after the operation:

const params = {
    TableName: "event",
    Key: {
        "eventId": date + '-' + eventName + '-' + eventPurpose
    },
    UpdateExpression: "SET eventName = :eventName, eventPurpose = :eventPurpose, eventDates = :eventDates, attendees = :attendees",
    ExpressionAttributeValues: {
        ":eventName": eventName,
        ":eventPurpose": eventPurpose,
        ":eventDates": eventDates,
        ":attendees": attendees
    },
    ReturnValues: "ALL_NEW"
};

Using GetItem right after PutItem is not a good idea unless you are using strong consistency in DynamodDB. If you have eventual consistency (default) then GetItem right after PutItem can still return empty.

Solution 4

Note that this is the item you are inserting, which you already have access to:

{
    "eventId": date + '-' + eventName + '-' + eventPurpose,
    "eventName": eventName,
    "eventPurpose": eventPurpose,
    "eventDates": eventDates,
    "attendees": attendees
}

You could simply change your code to this, and then you would have the inserted item in the item variable already:

var item = {
        "eventId": date + '-' + eventName + '-' + eventPurpose,
        "eventName": eventName,
        "eventPurpose": eventPurpose,
        "eventDates": eventDates,
        "attendees": attendees
    };

const params = {
    TableName: "event",
    Item: item,
    ReturnValues: "ALL_OLD"
  };

You seem to be confused about what you are inserting, because you start your question by showing an object you say you are inserting, but the code you posted is inserting a slightly different object.

Share:
24,274
Lakshman Diwaakar
Author by

Lakshman Diwaakar

Product & Engineering Specialities: Serverless Architecture Configuration management and Devops technologies like ansible, docker and vagrant. Google Cloud Platform. Amazon Web Services. Nodejs, Mongodb, Java, Hadoop.

Updated on September 26, 2020

Comments

  • Lakshman Diwaakar
    Lakshman Diwaakar over 3 years

    I am using nodeJS sdk to put the item to dynamoDB, The item is:

    {
       "eventId": date + '-' + eventName + '-' + eventPurpose,
       "eventName": eventName,
       "eventPurpose": eventPurpose,
       "eventDates": eventDates,
       "attendees": attendees
     }
    

    The present code for the putting the item in dynamoDB:

      const params = {
        TableName: "event",
        Item: {
            "eventId": date + '-' + eventName + '-' + eventPurpose,
            "eventName": eventName,
            "eventPurpose": eventPurpose,
            "eventDates": eventDates,
            "attendees": attendees
        },
        ReturnValues: "ALL_OLD"
      };
    
      dynamo.put(params, (err, data) => {
        console.log("coming here");
        if (err) {
          console.log("error : " + JSON.stringify(err));
        }
        console.log("data" + JSON.stringify(data));
        cb(null, data);
      });
    

    The insertion happens correctly and the return value is an empty object.

    I would like to return the inserted item. I found this doc. But this returns only in case of updating the old value. I could not find any other useful info other than this.

    Is there any work around or we simply need to query using get method with the primary key?