如何在dynamoDB中返回插入的项目

Lak*_*kar 17 amazon-web-services node.js amazon-dynamodb aws-lambda serverless-framework

我使用nodeJS sdk将项目放到dynamoDB,该项目是:

{
   "eventId": date + '-' + eventName + '-' + eventPurpose,
   "eventName": eventName,
   "eventPurpose": eventPurpose,
   "eventDates": eventDates,
   "attendees": attendees
 }
Run Code Online (Sandbox Code Playgroud)

将项目放入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);
  });
Run Code Online (Sandbox Code Playgroud)

插入正确发生,返回值是一个空对象.

我想返回插入的项目.我找到了这个文档.但只有在更新旧值时才会返回.除了这个,我找不到任何其他有用的信息.

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

Die*_*rri 15

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

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

简而言之,检索插入对象的唯一可靠方法是GetItem,就像你猜测的那样.

  • 2023 年,遗憾的是,这个答案仍然是正确的...... (4认同)

小智 12

只需传递params.Item回调:

 dynamo.put(params, (err, data) => {
        if (err) {
          cb(err);
        }
        cb(null, params.Item);
      });
Run Code Online (Sandbox Code Playgroud)

也通过err回调;)

  • 是不是在欺骗?...我的意思是我想要插入数据库中的真实数据,对吗? (7认同)
  • 存储的实际对象可能与您要存储的对象略有不同.传递错误应该允许创建对象失败,这不是问题的真正答案. (5认同)
  • 你一生都在哪里 (4认同)

小智 6

您可以使用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"
};
Run Code Online (Sandbox Code Playgroud)

使用GetItem之后PutItem是不是一个好主意,除非你是在使用DynamodDB很强的一致性。如果你有最终的一致性(默认),那么GetItem在之后PutItem仍然可以返回空。