c# - Mongodb C# Driver Unsupported filter error with specific linq predicate
问题描述
我有一个 IMongoCollection 内容:
collection = [
{Value = 'x', EntryPoint= 'ROOT/1' },
{Value = 'y', EntryPoint= 'ROOT/2' },
{Value = 'z', EntryPoint= 'OTHER/1' }]
现在我想用过滤我的收藏
userEntryPoints = ['ROOT', 'SPECIAL']
。
我们定义了,如果我有entrypoint = 'ROOT'
,我们也有入口点是等价的'ROOT/1', 'ROOT2'
。
所以预期的结果是
result = [
{Value = 'x', EntryPoint= 'ROOT/1' },
{Value = 'y', EntryPoint= 'ROOT/2' }]
我正在使用的代码是
var collection = mongoDatabase.GetCollection(Data);
return collection.AsQueryable().Select(xxx)
.Where(item => userEntryPoints.Any( entrypoint => item.EntryPoint.StartsWith(entrypoint)))
如果collection
并且userEntryPoints
是简单数组,这应该可以工作。
但是在我的代码中,在运行时我有一个 mongodb 错误:
Unsupported filter: Any(value(System.Collections.Generic.List`1[System.String]].Where({document}{EntryPoint}.StarsWith(document))))
At MongoDB.Driver.Linq.Traslators.PredicateTranslator.Translate(Expression node)
我该怎么做才能使这种过滤成为可能?谢谢你。
解决方案
这可以返回两个匹配的文档:
Regex regex = new Regex("^ROOT|^SPECIAL");
var qry = collection.AsQueryable()
.Where<CollectonClass>(e => regex.IsMatch(e.EntryPoint))
.Select(e => new { e.Value, e.EntryPoint } );
var docList = qry.ToList();
docList.ForEach(e => Console.WriteLine(e.ToJson()));
变体:
var rgxList = new string [] { "^ROOT", "^SPECIAL" };
var rgx = new Regex(string.Join("|", rgxList));
var filter = Builders<BsonDocument>.Filter.Regex("EntryPoint", rgx);
var list = collection.Find(filter).ToList<BsonDocument>();
推荐阅读
- ruby - 在将多个用户输入保存为变量之前检查它们是否满足特定条件
- python - 如何将返回的变量传递给 Jupyter Notebook 中的其他方法
- sql - SQL - round down to two decimal places
- mapbox - Get bounding box for a layer in Mapbox-GL-JS
- flask - 引导程序/烧瓶格式问题
- git - What does `git commit file.txt` do if file.txt is not staged?
- javascript - LeafletJS Marker latitude and longitude is incorrect when placed within China
- php - getting error "Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064"
- java - 如何从服务器端 java 返回正确的 JSON 到 DataTables?
- sql - R 中有没有办法将扁平的层次结构表转换为完整的扩展输出以用于映射?