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

45

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


在回调函数中,如果你收到了 err,一定不要像成功时那样调用 lambda 的 callback。使用常规的 if/else 语句块可以帮助消除未来的混淆! - Peter Wagener
4个回答

34
抱歉,你发布的链接(API版本2012-08-10)是目前唯一的真实答案。PutItem 可能会返回在更新之前的物品或根本没有物品。

返回值 参数被多个 DynamoDB 操作使用; 然而,PutItemNONEALL_OLD 之外不识别任何值。

总之,检索插入对象的唯一可靠方法是像你猜测的那样进行 GetItem

2
2023年,遗憾的是,这个答案仍然是正确的... - Diego Ferri

27

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

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

在回调函数中也传递 err 哦 ;)


7
你在我一生中都去哪儿了。 - booky99
19
那不算作弊吗?...我的意思是我想要被插入到数据库中的真实数据,对吧? - MeBNoah
有点。这取决于您想要返回什么:要存储在数据库中的对象还是实际存储的对象。 - Sigma
12
存储的实际对象可能与您想要存储的对象略有不同。虽然传递错误应该允许对象创建失败,但这并不是问题的真正答案。 - Harry
厉害的黑客! - BALA

17
你可以使用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"
};

在DynamoDB中,如果您使用的是强一致性,则在 PutItem 之后立即使用 GetItem 可能不是个好主意。 如果您使用事件一致性(默认),则 PutItem 之后立即使用 GetItem 仍可能返回空值。


AWS很棒..无论如何感谢你的分享! - rodolfoksveiga

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

您似乎对您正在插入的内容感到困惑,因为您在问题中展示了一个您说要插入的对象,但是您发布的代码却插入了一个略有不同的对象。


1
是的,你说得对。第一个代码片段包含请求主体。不知怎么搞的,我弄成了对象。谈到问题,你的解决方案很好,但通常在mongoDB中,它返回插入的对象,我想Amazon DynamoDB中也可能有类似的东西。 "ReturnValues:ALL_NEW" 仅在更新操作中允许使用。在put操作中,只有"NONE"或"ALL_OLD"。感谢您快速的回答。我会按照您所说的去做。简单而优雅的方法。谢谢Mark!! - Lakshman Diwaakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接