35

我正在使用 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 方法进行查询?

4

4 回答 4

28

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

ReturnValues参数由多个 DynamoDB 操作使用;但是,PutItem不识别除NONEor以外的任何值ALL_OLD

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

于 2016-09-27T15:05:57.007 回答
23

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

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

也传递err回调;)

于 2016-09-12T23:11:36.773 回答
10

您可以使用UpdateItem而不是PutItem. UpdateItem如果它不存在,则创建一个新项目,另外您可以设置ReturnValuesALL_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除非您在DynamodDB 中使用强一致性,否则立即使用PutItem不是一个好主意。如果您具有最终一致性(默认),那么GetItem之后PutItem仍然可以返回空。

于 2020-09-25T13:06:52.280 回答
3

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

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

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

于 2016-09-12T13:48:53.453 回答