Как получить данные из коллекции MongoDB в C# с помощью регулярных выражений?

Я использую MongoDB.Drivers пакет Nuget в моем MVC (C#) веб-приложение для связи с базой данных MongoDB. Теперь я хочу получить данные на основе конкретного столбца и его значения. Я использовал приведенный ниже код для получения данных.

var findValue = "John";
                var clientTest1 = new MongoClient("mongodb://localhost:XXXXX");
                var dbTest1 = clientTest1.GetDatabase("Temp_DB");
                var empCollection = dbTest1.GetCollection<Employee>("Employee");
                var builder1 = Builders<Employee>.Filter;
                var filter1 = builder1.Empty;
                var regexFilter = new BsonRegularExpression(findValue, "i");
                filter1 = filter1 & builder1.Regex(x => x.FirstName, regexFilter);
                filter1 = filter1 & builder1.Eq(x => x.IsDeleted,false);
                var collectionObj = await empCollection.FindAsync(filter1);
                var dorObj = collectionObj.FirstOrDefault();

Но приведенный выше код выполняет like запрос. Значит работает как (select * from Employee where FirstName like '%John%'Я не хочу этого Я хочу получить только те данные, чьи FirstName значение должно соответствовать точно. (как в этом случае FirstName должно равняться John).

Как я могу это сделать, кто-нибудь может дать мне предложения по этому вопросу.

Примечание: я использовал new BsonRegularExpression(findValue, "i") сделать поиск case-insensitive,

Любая помощь будет высоко оценен.

Спасибо

1 ответ

Решение

Я бы порекомендовал хранить нормализованную версию ваших данных и индексировать / искать по ней. Вероятно, это будет значительно быстрее, чем при использовании регулярных выражений. Конечно, вы потребляете немного больше места для хранения, добавляя "john" вместе с "John", но ваш доступ к данным будет быстрее, поскольку вы просто сможете использовать стандартный запрос $ eq.

Если вы настаиваете на регулярном выражении, я рекомендую использовать ^ (начало строки) и $ (конец строки) вокруг вашего поискового запроса. Помните, однако, что вы должны избегать своего значения find, чтобы его содержимое не обрабатывалось как RegEx.

Это должно работать:

string escapedFindValue = System.Text.RegularExpressions.Regex.Escape(findValue);
new BsonRegularExpression(string.Format("^{0}$", escapedFindValue), "i");

Или, если вы используете более новую версию фреймворка, вы можете использовать интерполяцию строк:

string escapedFindValue = System.Text.RegularExpressions.Regex.Escape(findValue);
new BsonRegularExpression($"^{escapedFindValue}$", "i");
Другие вопросы по тегам