Как вернуть вставленный элемент в 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"
  };

Вы, похоже, не понимаете, что вставляете, потому что вы начинаете свой вопрос с показа объекта, который, как вы говорите, вставляете, но код, который вы разместили, вставляет немного другой объект.

Другие вопросы по тегам