Как выполнить запрос по ключу сортировки в AWS DynamoDB? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть база данных пользователей, и я хотел бы вернуть всех пользователей с фамилией X. В настоящее время у меня есть «последний» в качестве ключа сортировки для моей таблицы. Я запускаю следующий код, но получаю сообщение об ошибке «Элемент схемы ключа пропущенного условия запроса».

var params = { TableName: 'Patients',
    KeyConditionExpression: '#id = :idNum',
    ExpressionAttributeNames: { 
       '#id': 'last' 
    },
    ExpressionAttributeValues: { 
      ':idNum': 'Test' 
    } 
};

docClient.query(params, function(err, data) {
    if (err) {
        console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    } else {
        console.log("Query succeeded.");
        res.json(data);
    }
}); 

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Это не тот способ, которым следует использовать DynamoDB / NoSQL. Вы либо создаете GSI в соответствии с предложением thomasmichaelwallace, либо фамилию пользователя также используете в качестве ключа раздела. Вы можете добавить «ln_» перед всеми вашими ключами разделов, чтобы отделить их от других ключей разделов. Если у вас было имя в качестве разделов, прежде чем ваш первичный ключ должен выглядеть следующим образом:

partition | sort
fn_hans | ln_zimmer
fn_steve | ln_jobs
ln_zimmer | fn_hans
ln_jobs | fn_steve

Теперь вы можете запрашивать все разделы, начинающиеся с ln_. И да, вы должны иметь дублирующие данные в noSql. NoSQL Design содержит несколько статей о том, как проектировать таблицу DynamoDB.

0 голосов
/ 12 ноября 2018

Для запроса вы должны предоставить ключ раздела, поэтому с вашей таблицей, как она есть, ваш единственный вариант будет делать сканирование (что дорого и почти никогда не рекомендуется).

Однако вы можете легко добавить Глобальные вторичные индексы , чтобы позволить вам использовать другой ключ в качестве раздела.

В этом случае вы можете добавить GSI с last в качестве ключа раздела.

Тогда вы сможете запросить глобальный вторичный индекс (обратите внимание на параметр IndexName ) по фамилии.

Однако, если вы хотите пройти маршрут сканирования, вам нужно будет использовать:

docClient.scan({
  TableName: 'Patients',
  FilterExpression: '#l = :l',
  ExpressionAttributeNames: { '#l': 'last' },
  ExpressionAttributeValues: { ':l': 'Test' },
  Limit: 1
}, (err, data) => { /* callback */ })

Просто помните, что использование сканов может дорого обойтись и быстро поставить нагрузку на ваш стол ( подробнее здесь )

...