MongoDB C#驱动如何实现判断字段值包含在指定字符串的查询
MongoDB C# 驱动实现字段值被指定字符串包含的查询方法
报错原因
MongoDB.Driver的LINQ提供器仅支持解析x => x.字段.Contains(搜索内容)类逻辑(用于判断字段内容包含给定值),你使用的x => 搜索内容.Contains(x.字段)为反向判断逻辑,无法被直接翻译成MongoDB原生查询语句,因此会抛出不支持异常。
推荐实现方案(服务端执行,性能最优)
使用MongoDB的$expr运算符配合$indexOfCP方法构建查询条件:如果搜索文本中包含ItemName的值,$indexOfCP会返回匹配的起始下标(≥0),否则返回-1。
// 搜索文本 string SearchText = "你的指定搜索字符串"; // 构建查询过滤器 var filter = new BsonDocument("$expr", new BsonDocument("$gte", new BsonArray { new BsonDocument("$indexOfCP", new BsonArray { SearchText, "$ItemName" }), 0 } ) ); // 执行查询 var items = Db.Products.Find(filter).ToList();
如果需要不区分大小写匹配,可将两个对比值统一转为小写后再判断:
string lowerSearchText = SearchText.ToLower(); var filter = new BsonDocument("$expr", new BsonDocument("$gte", new BsonArray { new BsonDocument("$indexOfCP", new BsonArray { lowerSearchText, new BsonDocument("$toLower", "$ItemName") } ), 0 } ) );
小数据量临时方案(不推荐)
仅在集合数据量极小时可使用,该方式会加载全表数据到内存后过滤,数据量大时性能极差:
var items = Db.Products.AsEnumerable().Where(x => SearchText.Contains(x.ItemName)).ToList();
内容的提问来源于stack exchange,提问作者YaRmgl
相关产品推荐
相关产品推荐

