2017-02-05 15 views
0

Я пытаюсь написать сервер GraphQL, который запрашивает хранилище AWS DynamoDB.Лучший способ запроса 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.

Положите это так, почему мне кажется, что я пишу SQL для базы данных NoSQL?

ответ

0

К сожалению, то, что я пытаюсь достичь, с DynamoDB невозможно.

Метод scan поверхностно предлагает эту функциональность. Но он действительно просто возвращает весь набор таблиц, а затем фильтрует его потом. Как только ваш набор данных достигнет определенного размера, scan перестает работать.

Метод query - это то, что вы действительно должны использовать. Но он не позволит запрашивать более двух ключей. Это просто ужасно. Это крайне неадекватно для так называемой базы данных.

Другими словами, API DynamoDB не просто синтаксически примитивен. Он также функционально примитивен.

1

На самом деле, вы написали самый короткий код для того, чего вы пытаетесь достичь, потому что именно так DynamoDB ожидает фильтрацию информации для Scan.

Вы также можете рассмотреть возможность перемещения фильтров с DynamoDB-side на клиентскую сторону, если это помогает снизить сложность кода. Это не изменит потребляемые единицы чтения, поэтому ваши затраты на чтение останутся неизменными.

 Смежные вопросы

  • Нет связанных вопросов^_^