【问题标题】:How to return the inserted item in dynamoDB如何在 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 块将有助于在未来消除混乱!

标签: node.js amazon-web-services amazon-dynamodb aws-lambda serverless-framework


【解决方案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 仍然可以返回空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2021-04-25
      • 2016-12-07
      • 2019-01-23
      相关资源
      最近更新 更多