1

对 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/搜索操作,基于提供的数组元素...似乎我不能使用字符串数组作为初始表达式(allWordsArr.Any(...))

如何使用多个字段和单词数组执行搜索?我更喜欢使用 collection.AsQueryable(..)+LINQ 方法,但如果不可能 - 欢迎任何建议......

非常感谢!

4

1 回答 1

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();
于 2021-07-03T08:06:05.137 回答