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?
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 thanNONE
orALL_OLD
.
In short, the only reliable way to retrieve your inserted object is to GetItem
, just as you surmised.
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 ;)
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.
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.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.