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 上执行的查询

Core源码IQueryable(转)

温故知新C#中 IEnumerable 与IQueryable

IQueryable 和 IEnumerable 有啥区别 [重复]

Entity Framework 第十篇 条件查询

IQueryable 或 IList