#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, но оба поля идентификатора будут иметь ограничения внешнего ключа. Как правило, вы хотите избежать сканирования таблиц, потому что они считывают каждый элемент в таблице.