AWS DynamoDB использует QueryAsync вместо ScanAsync - PullRequest
0 голосов
/ 11 января 2019

Использование .net core api (c #) с DynamodB здесь. У меня есть класс dbmanager как:

public class DbManager<T> : DynamoDBContext, IDynamoDbManager<T> where T : class
{
    private DynamoDBOperationConfig _config;

    public DbManager(IAmazonDynamoDB client, string tableName) : base(client)
    {
        _config = new DynamoDBOperationConfig()
        {
            OverrideTableName = tableName
        };
    }

    public Task<List<T>> GetAsync(IEnumerable<ScanCondition> conditions)
    {
        return ScanAsync<T>(conditions, _config).GetRemainingAsync();
    }       
}

public interface IDbManager<T> : IDisposable where T : class
{
    Task<List<T>> GetAsync(IEnumerable<ScanCondition> conditions);
}

И в моем контроллере:

  public class ValuesController : Controller
  {
      private readonly IDbManager<MyData> _dbManager;
      public ValuesController(IDbManager<MyData> dbManager)
      {
         _dbManager = dbManager;
      }

     [HttpGet()]
     [Route("sets/filter")]
     public async Task<IActionResult> GetAllData(string id, string name)
     {
        List<ScanCondition> conditions = new List<ScanCondition>();
        conditions.Add(new ScanCondition("Id", ScanOperator.Equal, id));
        conditions.Add(new ScanCondition("Name", ScanOperator.Equal, name));

        var response = await _dynamoDbManager.GetAsync(conditions);
        return Ok(response.ToList());           
     }    
  }

Мой приведенный выше код работает нормально, просто когда данные в таблице становятся слишком большими, операция становится очень медленной. Кто-то сказал мне, чтобы он использовал метод QueryAsync вместо ScanAsync, поскольку метод сканирования сканирует всю таблицу и работает медленно.

Я посмотрел на метод QueryAsync и проверил, что он принимает hashkey в качестве одного из параметров.

Мой вопрос: как я могу использовать QueryAsync вместо ScanAsync с моим кодом выше? Я вызываю вышеуказанную конечную точку из своего пользовательского интерфейса, и она передает различные параметры в условия сканирования и фильтры там. Как я могу передать эти условия в метод QueryAsync.

Буду признателен за вводимые данные

1 Ответ

0 голосов
/ 12 января 2019

Вы не можете. Для динамических запросов требуется как минимум хеш-ключ таблицы или индекса, который вы хотите запросить. Вы не можете запрашивать произвольные атрибуты. Если вам нужно поддержать, что ваши варианты:

  1. Используйте сканирование Dynamo и признайте, что производительность и денежные затраты, вероятно, будут ниже приемлемых
  2. Использование Dynamo в качестве базы данных записей, но копирование данных в нечто вроде AWS ElasticSearch для включения случайных запросов
  3. Дитч Динамо и просто использовать обычную реляционную базу данных. RDS поддерживает множество различных типов баз данных
  4. Выполните анализ общих запросов, которые вам нужно сделать, и соответствующим образом смоделируйте ваши данные в Dynamo. Это может потребовать добавления дополнительных индексов в таблицу и дублирования данных несколько раз с разными ключами для поддержки разных типов запросов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...