Фильтрация в DynamoDB по ошибкам без PartitionKey и ключа сортировки - условие схемы запроса пропущено по ключевому элементу - PullRequest
1 голос
/ 03 апреля 2020

Я хочу отфильтровать результаты внутри DynamoDB по данным, которые не являются PartitionKey или Sort KEY (name = RowKey). Я могу ограничить результат с помощью PartitionKey. Поэтому я попытался сделать это в соответствии с документацией, чтобы сделать запрос (без ключа сортировки), но я получаю эту ошибку:

  Unable to query. Error: {
  "message": "Query condition missed key schema element: RowKey",
  "code": "ValidationException",
  "time": "2020-04-03T13:09:17.635Z",
  "requestId": "ECD4VQBGFB0IUM6G9TUSPKA3LRVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 43.542922337630074
}

На следующем рисунке показана конфигурация таблицы

Table configuration Keys and Sort

И вот код, который я использовал:

    async function FilterUsersAwsQUERY (_tenant_id,_filter) {
    //debug('Enter in function');
    var params = {
      TableName : "zzzuser",
      ProjectionExpression:"#pk, comapnyrole",
      KeyConditionExpression: "#pk = :pk and #cr = :cr",
      ExpressionAttributeNames:{
          "#pk": "PartitionKey",
          "#cr": "companyrole"
      },
      ExpressionAttributeValues: {
          ":pk":  _tenant_id,
          ":cr": _filter
      }

  };
    return new Promise (function(resolve, reject) {

        //debug('Start query');
        docClient.query(params, function(err, data) {
            if (err) {
                console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
                reject(err);
            } else {
                //console.log("AWS ALL Query succeeded.");
                resolve(data.Items);
                //data.Items.forEach(function(item) {
                //    console.log(" -", item.year + ": " + item.title);
                //});
            }
        });
    });
  };

PS. Я знаю, что есть опции .scan, но на это уходит более 10 секунд, потому что у меня есть 10.000 записей внутри, и каждый PartitionKey составляет около 400 записей.

Есть ли способ сделать это эффективно? Спасибо всем

1 Ответ

0 голосов
/ 23 апреля 2020

Ключевым выражением условия должен быть ключ раздела или ключ раздела и ключ сортировки. Затем вы можете сузить его с помощью FilterExpression . Тем не менее, уточнение с помощью выражения фильтра может быть дорогостоящим, если вам приходится делать это часто, и результирующий набор для фильтрации является большим.

Это время, когда LSI или GSI могут быть лучшей ставкой, если это шаблон доступа, который вы должны делать часто и с высокой производительностью. если это не то, что вы делаете часто, возможно, будет дешевле принять удар с помощью FilterExpression, поскольку это будет дешевле. Вы не дали достаточно информации, чтобы я знал, так или иначе.

...