Запрос нескольких данных с массивом первичных идентификаторов в 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));
    }
});
Другие вопросы по тегам