Как получить данные из коллекции 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");