【问题标题】:AWS DynamoDB data with and/or without types?带和/或不带类型的 AWS DynamoDB 数据?
【发布时间】: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

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

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    找到这个:

    正是我想要的。

    安装: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 文档客户端之上,虽然我没有做太多的挖掘工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-29
          • 1970-01-01
          • 2020-12-15
          • 2019-11-11
          • 2011-11-03
          相关资源
          最近更新 更多