2017-02-05 68 views
0

我正在嘗試編寫查詢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?

回答

0

不幸的是,我想要達到的僅僅是DynamoDB無法實現的。

scan方法表面上提供了此功能。但它真的只是返回整個表集,然後過濾。一旦你的數據集達到一定的大小,scan停止工作。

query方法是你真正應該使用的。但它不允許在兩個以上的鍵上進行查詢。這簡直令人震驚。對於一個所謂的數據庫來說,這是極其不足的。

換句話說,DynamoDB API不僅僅是語法上的原始語言。它在功能上也是原始的。

1

你寫的是你試圖實現的最短代碼,因爲DynamoDB期望爲Scan過濾信息。

如果有助於降低代碼複雜性,您還可以考慮將過濾從DynamoDB端移動到客戶端。這不會改變所消耗的讀取容量單位,所以您的讀取成本將保持不變。