Как запросить DynamoDB с несколькими идентификаторами, например: student_id в [1,2,3] #rails

#ruby-on-rails #ruby #amazon-web-services #amazon-dynamodb #dynamodb-queries

#ruby-on-rails #ruby #amazon-веб-сервисы #amazon-dynamodb #dynamodb-запросы

Вопрос:

У меня есть таблица в DynamoDB.

 student_id, name, age, address  partition_key: student_id, table_name: students
 

допустим, идентификаторы учащихся равны 1,2,3 и т.д…
Я хотел запросить студентов на основе идентификаторов.
например, sql select * из students, где id в (1,2,3)

Как сделать то же самое в DynamoDB

Пожалуйста, помогите мне с параметрами запроса. Я пытался

 params = {
:table_name=>"students",
:key_condition_expression=>"student_id IN :student_id",
:expression_attribute_values=>{":student_id"=> [1,2,3]}
}


 

Комментарии:

1. Я получаю Aws::DynamoDB::Errors::ValidationException: One or more parameter values were invalid: Condition parameter type does not match schema type за приведенный выше код, если я делаю = вместо IN . Я думаю, ‘IN’ не поддерживается

2. Возможно, это просто проблема, которую путают с тем фактом, что хэш-ключ вызывается так же, как и ключ таблицы. Я никогда не пользовался DynamoDB, но вы пробовали написать что-то подобное? ruby params = { :table_name=>"students", :key_condition_expression=>"student_id IN :student_ids", :expression_attribute_values=>{":student_ids"=> [1,2,3]} }

3. IN не поддерживается в key_condition_expression

Ответ №1:

DynamoDB не позволяет вам применять условные обозначения вокруг ключа раздела (например, PK в [1,2,3]), вам нужно указать это явно. Однако вы можете выполнять различные операции с условиями вокруг ключей сортировки (<,>, begins_with и т. Д.).

Комментарии:

1. Это мне не помогает

2. Это должно помочь вам не продолжать идти по неверному пути, пытаясь определить правильные параметры для отправки операции запроса. Проблема не в операции запроса.

Ответ №2:

Если вы можете определить первичный ключ, который, как я предполагаю, является вашим student_id, и вам нужны учащиеся с идентификаторами 1, 2 и 3, тогда вы можете использовать клиентский batch_get_item() .

Комментарии:

1. Еще один сценарий. Предположим, что в таблице student есть project_id. Что, если бы я хотел запросить студентов, которые работают над конкретными проектами? select * from students where project_id in (1,2,4) ?

2. Для DynamoDB существуют документы по моделированию данных, которые стоит прочитать, особенно если ваш фон — SQL, а не NoSQL. В запросе проекта я предполагаю, что данный студент может работать над несколькими проектами, поэтому вам может понадобиться вторая таблица ProjectStudents с ключом project_id student_id, а затем выполнить 3 запроса (не получить) со значениями project_id 1, 2 и 3. Это также в значительной степени то, как вы моделируете это в SQL, но оба поля идентификатора будут иметь ограничения внешнего ключа. Как правило, вы хотите избежать сканирования таблиц, потому что они считывают каждый элемент в таблице.