【问题标题】:Best way to query DynamoDB查询 DynamoDB 的最佳方式
【发布时间】:2017-02-05 06:58:10
【问题描述】:

我正在尝试编写一个查询 AWS DynamoDB 存储的 GraphQL 服务器。

就这个问题而言,GraphQL 部分是无关紧要的,除了参数以以下形式出现:

{
   key1: value1,
   key2: value2,
   key3: value3
}

这些键/值对用于查询数据库。只有严格的平等,没有什么花哨的。所有参数都是可选的。

这是我想出的:

import { DynamoDB } from 'aws-sdk';

function constructParams(tableName, fields = {}) {
  const keys = Object.keys(fields);

  if (keys.length === 0) {
    return {
      TableName: tableName,
    };
  }

  const filters = keys.map(key => `#${key} = :${key}`);
  const attributeNames = keys.reduce((memo, key) => Object.assign(memo, {
    [`#${key}`]: key,
  }), {});
  const attributeValues = keys.reduce((memo, key) => Object.assign(memo, {
    [`:${key}`]: fields[key],
  }), {});

  return {
    TableName: tableName,
    FilterExpression: filters.join(' AND '),
    ExpressionAttributeNames: attributeNames,
    ExpressionAttributeValues: attributeValues,
  };
}

function query(tableName, fields = {}) {
  const docClient = new DynamoDB.DocumentClient({ region: 'ap-southeast-2' });
  const params = constructParams(tableName, fields);

  return new Promise((resolve, reject) => {
    docClient.scan(params, (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data.Items);
      }
    });
  });
}

export default query;

这很好用。但天哪,这很麻烦。我的constructParams 函数感觉就像是不必要的样板。 MongoDB 完全不需要这样的功能。

这样说吧,为什么感觉我在为 NoSQL 数据库写 SQL?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb nosql


    【解决方案1】:

    您编写的代码确实是您想要实现的最短代码,因为这就是 DynamoDB 期望为Scan 过滤信息的方式。

    如果有助于降低代码复杂性,您还可以考虑将过滤从 DynamoDB 端转移到客户端。这不会改变消耗的读取容量单位,因此您的读取成本将保持不变。

    【讨论】:

      【解决方案2】:

      遗憾的是,DynamoDB 无法实现我想要实现的目标。

      scan 方法表面上提供了这个功能。但它实际上只是返回整个表集,然后过滤。一旦您的数据集达到一定大小,scan 就会停止工作。

      query 方法是您真正应该使用的方法。但它不允许查询超过两个键。这简直骇人听闻。对于所谓的数据库来说,它是远远不够的。

      换句话说,DynamoDB API 不仅仅是语法上的原始。它在功能上也很原始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        相关资源
        最近更新 更多