1

MongoDB.Drivers在我的 Web 应用程序中使用 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

任何帮助将不胜感激。

谢谢

4

1 回答 1

1

我建议存储数据的规范化版本,并在此基础上进行索引/搜索。它可能会比使用正则表达式快得多。当然,通过在“John”旁边包含“john”,您会占用更多的存储空间,但是您的数据访问会更快,因为您只能使用标准的 $eq 查询。

如果您坚持使用正则表达式,我建议您在搜索词周围使用^(start of line) 和(end of line)。$但请记住,您应该转义您的 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");
于 2018-03-20T06:29:50.807 回答