Как вернуть вставленный элемент в DynamoDB
Я использую nodeJS SDK, чтобы поместить элемент в DynamoDB, элемент:
{
"eventId": date + '-' + eventName + '-' + eventPurpose,
"eventName": eventName,
"eventPurpose": eventPurpose,
"eventDates": eventDates,
"attendees": attendees
}
Настоящий код для помещения элемента в 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);
});
Вставка происходит правильно и возвращаемое значение является пустым объектом.
Я хотел бы вернуть вставленный товар. Я нашел этот документ. Но это возвращается только в случае обновления старого значения. Я не мог найти другую полезную информацию, кроме этой.
Есть ли обходной путь или нам просто нужно запросить, используя метод get с первичным ключом?
3 ответа
К сожалению, размещенная вами ссылка является единственным реальным ответом на данный момент (версия API 2012-08-10). PutItem
может вернуть элементы непосредственно перед тем, как они были обновлены или вообще не возвращены.
ReturnValues
параметр используется несколькими операциями DynamoDB; тем не мение,PutItem
не распознает никаких значений, кромеNONE
или жеALL_OLD
,
Короче говоря, единственный надежный способ восстановить вставленный объект - это GetItem
Как вы и предполагали.
Просто передайте params.Item
в обратном вызове:
dynamo.put(params, (err, data) => {
if (err) {
cb(err);
}
cb(null, params.Item);
});
Пройти err
в обратном вызове тоже;)
Вы можете использовать
UpdateItem
вместо
PutItem
.
UpdateItem
создает новый элемент, если он еще не существует, плюс вы можете установить
ReturnValues
к
ALL_NEW
чтобы вернуть весь элемент в том виде, в каком он появляется в базе данных после операции:
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"
};
С помощью
GetItem
сразу после
PutItem
не лучшая идея, если вы не используете строгую согласованность в DynamodDB. Если у вас есть конечная согласованность (по умолчанию), тогда
GetItem
сразу после
PutItem
все еще может возвращаться пустым.
Обратите внимание, что это элемент, который вы вставляете, к которому у вас уже есть доступ:
{
"eventId": date + '-' + eventName + '-' + eventPurpose,
"eventName": eventName,
"eventPurpose": eventPurpose,
"eventDates": eventDates,
"attendees": attendees
}
Вы можете просто изменить свой код на это, и тогда у вас будет вставленный элемент в item
переменная уже:
var item = {
"eventId": date + '-' + eventName + '-' + eventPurpose,
"eventName": eventName,
"eventPurpose": eventPurpose,
"eventDates": eventDates,
"attendees": attendees
};
const params = {
TableName: "event",
Item: item,
ReturnValues: "ALL_OLD"
};
Вы, похоже, не понимаете, что вставляете, потому что вы начинаете свой вопрос с показа объекта, который, как вы говорите, вставляете, но код, который вы разместили, вставляет немного другой объект.