繁体   English   中英

Mongodb C# Driver Unsupported filter error with specific linq predicate

[英]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']过滤我的 collections 。

我们定义,如果我有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)))

如果collectionuserEntryPoints是简单的数组,这应该可以工作。

但是在我的代码中,在运行时我有一个 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>();

你不能对司机这样做。 它不翻译StartsWith 它只适用于简单的平等检查。 这是获得所需结果的方法。 您需要将输入转换为前缀正则表达式数组。 不幸的是,没有强类型的方法来做到这一点。

var userEntryPoints = "[/^ROOT/,/^SPECIAL/]";

FilterDefinition<Content> filter = $"{{ EntryPoint : {{ $in : {userEntryPoints} }} }}";

var result = await (await collection.FindAsync(filter)).ToListAsync();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM