2017-02-05 3 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 측에서 클라이언트 측으로 필터링을 이동하는 것도 고려해 볼 수 있습니다. 이렇게하면 소비 된 읽기 용량 단위가 변경되지 않으므로 읽기 비용은 동일하게 유지됩니다.

관련 문제