MongoDB+C#+IQueryable - 有一个字符串数组以及如何在 Where 子句中将其加入 Mongos 集合
Posted
技术标签:
【中文标题】MongoDB+C#+IQueryable - 有一个字符串数组以及如何在 Where 子句中将其加入 Mongos 集合【英文标题】:MondoDB+C#+IQueryable - have an array of strings and how to join it to Mongo's collection in the Where clause 【发布时间】:2021-07-02 16:27:50 【问题描述】:在 Mongo 方面有相当少的经验,请帮助...我在 Mondo DB 中有 Employee 集合(字段是:FirstName、LastName、Title 等),使用 C# MongoDB 驱动程序并将集合用作 IQueryable,所以我可以使用 LINQ 搜索数据。
我需要在 Mongo 的 Employee 集合中执行复杂的搜索。例如,用户输入 SearchText="John Doe CEO",代码将此字符串拆分为数组:["John", "Doe", "CEO"]。任务是:如果任何字段(FirstName OR LastName OR Title)包含数组中的任何单词,则查询应将其作为结果返回。
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 DB 上运行查询时,由于不支持的运算符 string[].Any... 而失败...所以我无法将数组从 C# 代码传递到 Mongo DB 然后 - 执行 LINQ /search 操作,基于提供的数组元素...似乎我不能使用字符串数组作为初始表达式 (allWordsArr.Any(...))
如何使用多个字段和单词数组执行搜索?我更喜欢使用 collection.AsQueryable(..)+LINQ 方法,但如果不可能 - 欢迎任何建议......
非常感谢!
【问题讨论】:
【参考方案1】:不要认为与 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();
【讨论】:
以上是关于MongoDB+C#+IQueryable - 有一个字符串数组以及如何在 Where 子句中将其加入 Mongos 集合的主要内容,如果未能解决你的问题,请参考以下文章
hotChocolate 中有没有办法记录在 IQueryable 上执行的查询
温故知新C#中 IEnumerable 与IQueryable