MongoDB C # без учета регистра сортировки и индексации - PullRequest
5 голосов
/ 29 июня 2019

До сих пор я использовал этот код, чтобы найти свои документы и затем отсортировать их:

        var options = new FindOptions
        {
            Modifiers = new BsonDocument("$hint", "PathTypeFilenameIndex")
        };

        return await Collection
            .Find(f => f.Metadata["path"] == path, options)
            .SortBy(f => f.Metadata["type"])
            .ThenBy(f => f.Filename)
            .ToListAsync();

У меня есть класс, который имеет поле метаданных с полями пути и типа, также у класса есть имя файлаполе.Я хочу, чтобы все документы с указанным путем внутри метаданных были отсортированы по типу, а затем по имени файла.

Примером может быть список документов, упорядоченных по полю «Имя», например:

a, Ab, B, c, D

К сожалению, я получаю что-то вроде этого:

Ab, B, D, a, c

И это потому, что MongoDB сортирует данные с помощью простого двоичного сравнения, где 'A' <'a' из-за их кодов ASCII. </p>

Итак, мой вопрос: Есть ли способ сделать регистр без учета регистра и продолжать использовать «$ hint»?

То, что параметры, которые я передаю методу Find, должно сообщать MongoDB, какой индексиспользовать.Я нашел этот пост: MongoDB и C #: поиск без учета регистра , но метод здесь не работает для сортировки, и я не мог сказать MongoDB, какой индекс использовать.

1 Ответ

2 голосов
/ 29 июня 2019

Я думаю, что вы можете использовать агрегационный конвейер с $addFields, $toLower (для преобразования имени файла в нижний регистр во временном поле) и $sort для их сортировки независимо от регистра

В оболочке mongodb вынапишет что-то вроде этого:

db.collection.aggregate([{
    $addFields : {
        "lowercaseFileName" : {
            $loLower : "$fileName"
        }
    },{
        $sort : {
            "metadata.type" : 1,
            lowercaseFileName : 1
        }
    }
}])

Пожалуйста, напишите аналогичный код в C #, и посмотрите, работает ли он.Я не знаю c #, иначе я бы дал вам точный запрос, но я не могу.

Идея состоит в том, чтобы преобразовать имя файла в нижний регистр, сохранить его во временном поле, используя addFields и отсортировать по этому полю.

Надеюсь, это поможет вам.

Подробнеео $ addFields , $ toLower здесь.

Обновление

Для тех, кто хочет рабочий код в C #, благодаря @ kaloyan-manev

Вы можете использовать это:

return await Collection.Aggregate()
    .Match(f => f.Metadata["path"] == path) 
    .AppendStage<BsonDocument>(new BsonDocument("$addFields", new BsonDocument("lowercaseFileName", new BsonDocument("$toLower", "$filename")))) 
    .AppendStage<GridFSFileInfo>(new BsonDocument("$sort", new BsonDocument { {"metadata.type", 1}, {"lowercaseFileName", 1} }))
    .ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...