MongoDB+C#+IQueryable - 有一个字符串数组以及如何在 Where 子句中将它加入 Mongo 的集合
MondoDB+C#+IQueryable - have an array of strings and how to join it to Mongo's collection in the Where clause
对 Mongo 的经验很少,请帮忙...我在 Mondo DB 中有员工集合(字段是:名字、姓氏、职位等),使用 C# Mongo数据库驱动程序并将集合用作 IQueryable,以便我可以使用 LINQ 搜索数据。
我需要在 Mongo 的员工集合中执行复杂的搜索。例如,用户输入 SearchText="John Doe CEO",代码将此字符串拆分为一个数组:["John", "Doe", "CEO"]。任务是:如果任何字段(FirstName OR LastName OR Title)包含数组中的任何单词,查询结果应该 return 它。
AFAIR,当我查询一个简单的列表时,这个语句工作正常:
collection.AsQueryable().Where(e =>
allWordsArr.Any(_ => e.FirstName.ToLower().StartsWith(_.ToLower())) ||
allWordsArr.Any(_ => e.LastName.ToLower().StartsWith(_.ToLower())) ||
allWordsArr.Any(_ => e.Title.ToLower().StartsWith(_.ToLower())))
但是当我 运行 对真实 Mongo 数据库的查询时,由于不受支持的运算符字符串 [] 而失败。任何...所以我无法从 C# 传递数组将代码写入 Mongo 数据库,然后 - 根据提供的数组元素执行 LINQ/search 操作...似乎我不能使用字符串数组作为初始表达式(allWordsArr.Any(...))
如何使用多个字段和一组单词执行搜索?我更愿意使用 collection.AsQueryable(..)+LINQ 方法,但如果不可能 - 欢迎任何建议...
非常感谢!
认为 linq/asqueryable 不可能。你可以用 find 来完成,像这样:
var allWords = new[] { "CEO", "Doe", "John" };
var filters = allWords.Select(w =>
Builders<Employee>.Filter.Regex(e => e.Title, "/^" + w + "/i") |
Builders<Employee>.Filter.Regex(e => e.FirstName, "/^" + w + "/i") |
Builders<Employee>.Filter.Regex(e => e.LastName, "/^" + w + "/i"));
var combinedFilter = Builders<Employee>.Filter.Or(filters);
var result = await collection.Find(combinedFilter).ToListAsync();
这里有一个替代方案:
var regex = "/^" + string.Join("|", allWords) + "/i";
var filter = Builders<Employee>.Filter.Regex(e => e.FirstName, regex) |
Builders<Employee>.Filter.Regex(e => e.LastName, regex) |
Builders<Employee>.Filter.Regex(e => e.Title, regex);
var result = await collection.Find(filter).ToListAsync();
对 Mongo 的经验很少,请帮忙...我在 Mondo DB 中有员工集合(字段是:名字、姓氏、职位等),使用 C# Mongo数据库驱动程序并将集合用作 IQueryable,以便我可以使用 LINQ 搜索数据。
我需要在 Mongo 的员工集合中执行复杂的搜索。例如,用户输入 SearchText="John Doe CEO",代码将此字符串拆分为一个数组:["John", "Doe", "CEO"]。任务是:如果任何字段(FirstName OR LastName OR Title)包含数组中的任何单词,查询结果应该 return 它。
AFAIR,当我查询一个简单的列表时,这个语句工作正常:
collection.AsQueryable().Where(e =>
allWordsArr.Any(_ => e.FirstName.ToLower().StartsWith(_.ToLower())) ||
allWordsArr.Any(_ => e.LastName.ToLower().StartsWith(_.ToLower())) ||
allWordsArr.Any(_ => e.Title.ToLower().StartsWith(_.ToLower())))
但是当我 运行 对真实 Mongo 数据库的查询时,由于不受支持的运算符字符串 [] 而失败。任何...所以我无法从 C# 传递数组将代码写入 Mongo 数据库,然后 - 根据提供的数组元素执行 LINQ/search 操作...似乎我不能使用字符串数组作为初始表达式(allWordsArr.Any(...))
如何使用多个字段和一组单词执行搜索?我更愿意使用 collection.AsQueryable(..)+LINQ 方法,但如果不可能 - 欢迎任何建议...
非常感谢!
认为 linq/asqueryable 不可能。你可以用 find 来完成,像这样:
var allWords = new[] { "CEO", "Doe", "John" };
var filters = allWords.Select(w =>
Builders<Employee>.Filter.Regex(e => e.Title, "/^" + w + "/i") |
Builders<Employee>.Filter.Regex(e => e.FirstName, "/^" + w + "/i") |
Builders<Employee>.Filter.Regex(e => e.LastName, "/^" + w + "/i"));
var combinedFilter = Builders<Employee>.Filter.Or(filters);
var result = await collection.Find(combinedFilter).ToListAsync();
这里有一个替代方案:
var regex = "/^" + string.Join("|", allWords) + "/i";
var filter = Builders<Employee>.Filter.Regex(e => e.FirstName, regex) |
Builders<Employee>.Filter.Regex(e => e.LastName, regex) |
Builders<Employee>.Filter.Regex(e => e.Title, regex);
var result = await collection.Find(filter).ToListAsync();