带和/或不带类型的 AWS DynamoDB 数据?

Posted

技术标签:

【中文标题】带和/或不带类型的 AWS DynamoDB 数据?【英文标题】:AWS DynamoDB data with and/or without types? 【发布时间】:2018-05-20 10:20:00 【问题描述】:

我正在使用 aws-sdk 让 NodeJS 与 DynamoDB 表进行交互。这是我第一次看到 DynamoDB。

当使用getItem()updateItem() 之类的调用时,数据结构包括类型,如下所示:


  'a':  S: 'My string' 

有没有办法在没有类型的情况下传递和接收这些对象..?所以...


  'a': 'My string'

或者,任何已经编写的帮助函数将对象转换为这种格式..?

const data = dbToObj( 'a':  S: 'My string'  )
//  'a': 'My string' 

所以我可以在填充调用参数时转换为它,并在接收数据时从它转换。

尽量避免访问我的数据,例如:

const myData = data.Item.something.M.somethinElse.M.qwerty.S

我知道我可以自己写一些东西,只是想知道是否有人知道已经可用的功能/选项可以做到这一点。我找不到。

【问题讨论】:

【参考方案1】:

找到这个:

https://github.com/kayomarz/dynamodb-data-types https://www.npmjs.com/package/dynamodb-data-types

正是我想要的。

安装:npm i dynamodb-data-types

提供wrap( 'a': 'My string' )unwrap( 'a': S: 'My string' ) 方法来执行与普通对象的转换。

更新

我现在还发现了这个:AWS.DynamoDB.DocumentClient,它是 aws-sdk 的一部分。

文档客户端通过抽象出属性值的概念来简化对 Amazon DynamoDB 中项目的处理。这种抽象对作为输入参数提供的原生 javascript 类型进行注释,并将带注释的响应数据转换为原生 JavaScript 类型。

更新 2

亚马逊正在他们的awslabs github 页面下进行这项工作:

Amazon DynamoDB Automarshaller

此库提供了一个 Marshaller 类,可将原生 JavaScript 值转换为 DynamoDB AttributeValues,然后再转换回来。它旨在与 ES6 功能(如集合、映射和可迭代对象)一起使用,并且可以配置为支持仅由 JavaScript(例如空二进制缓冲区)或 Amazon DynamoDB(例如任意大小的数字)支持的数据类型,且折衷最少。

这是他们DynamoDB DataMapper For JavaScript 包的一部分。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 我总体上同意并且我已经更新了我的答案。但是,在这种特定情况下,我所做的只是重复dynamodb-data-types 提供的方法调用,因此它们可能会像链接一样发生变化。我没有任何代码可以分享,不是dynamodb-data-types 代码,因为我的问题的答案是直接使用这个库。有道理..?不过,我似乎已经被否决了! :-(【参考方案2】:

我们在生产应用程序中使用带有 typescript 的 dynamo-easy。 (直接来自浏览器或内部 Lambda 函数)

它提供了从 JS 到 DynamoDB 类型的映射,还提供了一些不错的请求 API 抽象。

import  Model, PartitionKey, DynamoStore  from '@shiftcoders/dynamo-easy'

@Model()
export class Person 
  @PartitionKey()
  id: string
  name: string
  yearOfBirth: number


const personStore = new DynamoStore(Person)

personStore
  .scan()
  .whereAttribute('yearOfBirth').equals(1958)
  .exec()
  .then(res => console.log('ALL items with yearOfBirth == 1958', res))

全面披露:我是图书馆的作者之一

【讨论】:

【参考方案3】:

Dynogels 提供了一种更简洁的处理方式,无需担心类型。 我们在生产中使用它并且没有任何问题。

https://github.com/clarkie/dynogels

Account.create(email: 'foo@example.com', name: 'Foo Bar', age: 21, function (err, acc) 
  console.log('created account in DynamoDB', acc.get('email'));
);

它是 dynamodb 的 ODM(对象数据映射器)。

希望对你有帮助。

【讨论】:

【参考方案4】:

Dynamoose 是另一种建模工具,可以抽象出更多无关代码。 github 是here。我认为它建立在 AWS 文档客户端之上,虽然我没有做太多的挖掘工作。

【讨论】:

以上是关于带和/或不带类型的 AWS DynamoDB 数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive 中处理带和不带双引号的数据

使用带或不带 cognito 的 aws api 网关的联合身份的轻量级 rbac

AWS 数据管道 Dynamodb 到 Redshift

Kotlin 只读属性,带和不带 getter

带和不带 () 的条件运算符

您如何将 DynamoDB Map/List 类型转换为通过 AWS Pipeline 到 Redshift?