如何在 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 操作中,只有 NONE 或 ALL_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
不能识别除NONE
或ALL_OLD
之外的任何值。
简而言之,检索插入对象的唯一可靠方法是GetItem
,正如您所猜测的那样。
【讨论】:
【参考方案4】:您可以使用UpdateItem
代替PutItem
。 UpdateItem
如果它不存在则创建一个新项目,另外您可以将 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 中获取特定属性值
AWS AppSync:如何通过 DynamoDB 返回有效的 JSON