我正在嘗試編寫查詢AWS DynamoDB商店的GraphQL服務器。查詢DynamoDB的最佳方法
對於這個問題的目的,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?