【发布时间】: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