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

Posted

技术标签:

【中文标题】如何在 dynamoDB 中返回插入的项目【英文标题】:How to return the inserted item in dynamoDB 【发布时间】:2017-01-19 23:04:43 【问题描述】:

我正在使用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);
  );

插入正确发生,返回值为空对象。

我想退回插入的物品。我找到了这个doc。但这仅在更新旧值的情况下才会返回。除此以外,我找不到任何其他有用的信息。

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

【问题讨论】:

在你的回调中注意如果你收到err,你绝对不应该调用lambda callback,就好像它成功了一样。一个常规的if/else 块将有助于在未来消除混乱! 【参考方案1】:

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


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

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

【讨论】:

你是对的。第一个代码 sn-p 包含请求正文。不知何故,我感到困惑并使其具有对象。谈到这个问题,您的解决方案是一个很好的解决方案,但通常在 mongoDB 中,它返回插入的对象,我认为 dynamoDB 中可能有类似的东西。 ReturnValues: "ALL_NEW" 只允许在更新操作中使用。在 put 操作中,只有 NONEALL_OLD。感谢你及时的答复。我会按照你说的去做。简单而优雅的方法。谢谢马克!!【参考方案2】:

只需在回调中传递params.Item

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

在回调中也传递err ;)

【讨论】:

你这辈子都去哪儿了 这不是作弊吗? ...我的意思是我想要插入到数据库中的真实数据,对吧? 那种。这取决于您要返回什么:您要存储在数据库中的对象或实际存储的对象。 实际存储的对象可能与您要存储的对象略有不同。虽然传递错误应该允许对象创建失败,但这并不是问题的真正答案。 太棒了!!【参考方案3】:

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

ReturnValues 参数被多个 DynamoDB 操作使用;但是,PutItem 不能识别除 NONEALL_OLD 之外的任何值。

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

【讨论】:

【参考方案4】:

您可以使用UpdateItem 代替PutItemUpdateItem 如果它不存在则创建一个新项目,另外您可以将 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"
;

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

【讨论】:

以上是关于如何在 dynamoDB 中返回插入的项目的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Java 中的 DynamoDB getItem 中获取特定属性值

如何在 Go 中从 DynamoDB 表中删除多个项目

AWS AppSync:如何通过 DynamoDB 返回有效的 JSON

如何使用 Spring Boot 在 DynamoDB 中添加具有自动增量键的新项目

如何在dynamoDB,嵌套字典或多个项目中构建数据?

Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目