Драйвер Mongo C # - Как применить ToLower () к DistinctAsyc - PullRequest
0 голосов
/ 03 апреля 2019

Я получаю список строк из MongoDB, используя DistinctAsync. Проблема в том, что результаты отличаются, за исключением того, что я получаю некоторые значения в верхнем регистре, а некоторые в нижнем регистре, которые, конечно, считаются различными.

Как я могу применить .ToLower() к этому запросу?

public async Task<List<string>> GetAllAuthorsUserNames()
{
    var filter = Builders<Episode>.Filter.Where(x => x.CreatedBy != null);

    var cursor = await GetCollection().DistinctAsync(o => o.CreatedBy, filter);

    return cursor.ToList();
}

Я пробовал это, но это не работает:

var cursor = await GetCollection().DistinctAsync(o => o.CreatedBy.ToLower(), filter);

1 Ответ

2 голосов
/ 03 апреля 2019

Существуют различные подходы для достижения желаемого результата. Некоторые из них:

  1. Храните имена авторов только в нижнем регистре (или, по крайней мере, последовательным образом, чтобы вам не приходилось преобразовывать их имена, чтобы в первую очередь они отличались друг от друга), и в этом случае только отдельный запрос достаточно, чтобы получить желаемый результат.

  2. После того, как вы извлечете имена разных авторов из текущих данных, сопоставьте их имена с их соответствующей строчной версией в памяти, а затем примените к ней другую отдельную функцию, чтобы получить имена всех авторов в строчном и отличном виде. Это будет выглядеть так:

var filter = ...
var cursor = await GetCollection().DistinctAsync(v => v.CreatedBy, filter);
var list = await cursor.ToListAsync();

var names = list.Select(v => v.ToLower()).Distinct().ToList();
  1. Использовать агрегацию. По сути, вы можете project имена всех авторов в соответствующей строчной форме (см .: toLower ), а затем group все спроецированные имена строчных букв в набор (см: addToSet ) , Этот набор будет вашим результатом, который вы можете извлечь из агрегированного результата.

Мое мнение таково, что вам следует подумать об изменении своих данных, чтобы не добавлять излишнюю вычислительную сложность, которая требует ценных ресурсов. Если это невозможно, но самих имен относительно немного, вы можете использовать второй подход. Используйте третий подход, понимая, что он не идеален, и это увеличит объем обработки вашей СУБД.

...