1

I am using MongoDB.Drivers nuget package in my MVC (C#) web application to communication with MongoDB database. Now, I want to fetch data based on specific column and it's value. I used below code to fetch data.

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();

But, the above code is performing like query. It means it is working as (select * from Employee where FirstName like '%John%') I don't want this. I want to fetch only those data whose FirstName value should match exact. (like in this case FirstName should equal John).

How can I perform this, can anyone provide me suggestions on this.

Note: I used new BsonRegularExpression(findValue, "i") to make search case-insensitive.

Any help would be highly appreciated.

Thanks

1 Answer 1

1

I would recommend storing a normalized version of your data, and index/search upon that. It will likely be considerably faster than using regex. Sure, you'll eat up a little more storage space by including "john" alongside "John", but your data access will be faster since you would just be able to use a standard $eq query.

If you insist on regex, I recommend using ^ (start of line) and $ (end of line) around your search term. Remember though, that you should escape your find value so that its contents isn't treated as RegEx.

This should work:

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

Or if you're using a newer framework version, you can use string interpolation:

string escapedFindValue = System.Text.RegularExpressions.Regex.Escape(findValue);
new BsonRegularExpression($"^{escapedFindValue}$", "i");
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.