Запрос нескольких данных с массивом первичных идентификаторов в DynamoDB
Я работаю над приложением, которое использует DynamoDB в качестве базы данных. У меня есть таблица пользователей, таких как:
{
id: 1, (Primary Key)
name: "Indranil"
}
Теперь мое требование таково: у меня есть массив, если ids вроде: [1,5,8], и я хочу загрузить всех пользователей с помощью одного запроса.
Теперь я использую идентификатор как keyConditionExpreassion в запросе и могу извлекать данные каждого пользователя один за другим, но тогда это приведет к нескольким запросам.
let readparams = {
TableName : "user",
KeyConditionExpression: "# = :",
ExpressionAttributeNames:{
"#": "id"
},
ExpressionAttributeValues: {
":id":1
}
};
Затем я увидел, что в выражениях есть операция "IN", но ее нельзя использовать в выражении KeyConditionExpression, его можно использовать в FilterExpreassion, но в выражении filterExpression я не могу использовать первичный ключ. Более того, я не могу передать только выражение фильтра в запросе, мне также нужно передать ключевое выражение, но в моем случае у меня нет других условий для проверки.
let readparams = {
TableName : "user",
FilterExpression: "id IN (:id1, :id2)",
ExpressionAttributeValues: {
":id1":1,
":id2":1
}
};
Таким образом, в конце концов я оставил только вариант загрузки всех данных во внешнем интерфейсе, а затем отфильтровал те, которые используют идентификаторы во внешнем интерфейсе, но, очевидно, это не очень хорошее решение.
Может кто-нибудь, пожалуйста, укажите, что является лучшим решением здесь.
1 ответ
Пакетное API получения элементов может использоваться для получения нескольких элементов по ключевым атрибутам. Если для вашей таблицы определен ключ сортировки, вам необходимо указать значение атрибута ключа разделения и сортировки.
Пример кода:-
var table = "phone";
var params = {
"RequestItems" : {
"phone" : {
"Keys" : [ {
"phone_num" : "+14085551212",
"Country" : "USA"
},
{
"phone_num" : "+14085551313",
"Country" : "USA"
}
]
}
}
};
docClient.batchGet(params, function(err, data) {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err,
null, 2));
} else {
console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
}
});