如何使用正则表达式从 C# 中的 MongoDB 集合中获取数据?
How to fetch data from MongoDB collection in C# using Regular Expression?
我在 MVC (C#)
网络应用程序中使用 MongoDB.Drivers
nuget 包与 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
值应该完全匹配的数据。 (就像在这种情况下,名字应该等于 John
)。
我该如何执行此操作,任何人都可以为此提供建议。
注:我用new BsonRegularExpression(findValue, "i")
搜索case-insensitive
。
任何帮助将不胜感激。
谢谢
我建议存储数据的规范化版本,index/search 在此基础上。它可能比使用正则表达式快得多。当然,通过在 "John" 旁边包含 "john",您会占用更多的存储空间 space,但是您的数据访问速度会更快,因为您只能使用标准的 $eq 查询.
如果您坚持使用正则表达式,我建议您在搜索词周围使用 ^
(行首)和 $
(行尾)。但请记住,您应该转义查找值,这样它的内容就不会被视为 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");
我在 MVC (C#)
网络应用程序中使用 MongoDB.Drivers
nuget 包与 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
值应该完全匹配的数据。 (就像在这种情况下,名字应该等于 John
)。
我该如何执行此操作,任何人都可以为此提供建议。
注:我用new BsonRegularExpression(findValue, "i")
搜索case-insensitive
。
任何帮助将不胜感激。
谢谢
我建议存储数据的规范化版本,index/search 在此基础上。它可能比使用正则表达式快得多。当然,通过在 "John" 旁边包含 "john",您会占用更多的存储空间 space,但是您的数据访问速度会更快,因为您只能使用标准的 $eq 查询.
如果您坚持使用正则表达式,我建议您在搜索词周围使用 ^
(行首)和 $
(行尾)。但请记住,您应该转义查找值,这样它的内容就不会被视为 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");