如何return dynamoDB中插入的项目

How to return the inserted item in 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);
  });

插入正确,return 值为空对象。

我想return插入的项目。我找到了这个 doc。但这 returns 仅在更新旧值的情况下。除了这个,我找不到任何其他有用的信息。

是否有任何解决方法,或者我们只需要 使用带主键的 get 方法进行查询?

请注意,这是您要插入的项目,您已经可以访问该项目:

{
    "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"
  };

您似乎对插入的内容感到困惑,因为您通过显示您说要插入的对象来开始提问,但您发布的代码插入的对象略有不同。

只需在回调中传递 params.Item :

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

也在回调中传递 err ;)

遗憾的是,您发布的 link 是目前唯一真正的答案(API 版本 2012-08-10)。 PutItem 可能 return 项在更新之前或根本 none 项。

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

简而言之,正如您推测的那样,唯一可靠检索插入对象的方法是GetItem

您可以使用 UpdateItem 而不是 PutItemUpdateItem 创建一个新项目,如果它不存在的话,另外你可以设置 ReturnValuesALL_NEW 到 return 整个项目,因为它在操作后出现在数据库中:

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"
};

PutItem 之后立即使用 GetItem 不是一个好主意,除非您在 DynamodDB 中使用强一致性。如果你有最终一致性(默认)那么 GetItemPutItem 之后仍然可以 return 为空。