C# 字符串arg不能包含带字符串字段的mongodb C驱动器查询

C# 字符串arg不能包含带字符串字段的mongodb C驱动器查询,c#,mongodb,C#,Mongodb,mongodb数据: { name: "ccc" } C驱动器: string arg = "xxx ccc vvvv"; var match = from d in collection.AsQueryable<AAA>() where arg.Contains(d.name) select d; 我知道表演是不可能的。 我怎么做呢?你可以使用正则表达式 var regex = new Regex("xxx ccc vvv

mongodb数据:

{
    name: "ccc"
}
C驱动器:

string arg = "xxx ccc vvvv";
var match = from d in collection.AsQueryable<AAA>()
            where arg.Contains(d.name)
            select d;
我知道表演是不可能的。
我怎么做呢?

你可以使用正则表达式

var regex = new Regex("xxx ccc vvvv");
var query =
    from d in collection.AsQueryable<AAA>()
    where regex.IsMatch(d.Name)
    select d;

考虑到查询的性质,Mongo将需要访问集合中的每个文档,并执行一项可能代价高昂的操作

您无法有效地使用正则表达式,因为您试图以不受支持的方式进行包含匹配。您试图查询字段中的任何给定值是否包含在字符串中。你只能通过一个模式。因此,如果您知道它总是一组特定的字符或以某种方式,那么您需要编写一个表达式来专门查找它。鉴于你的样品,这可能是不可能的

您可以通过构造JavaScript使用$where运算符:

var arg = "xxx ccc vvvv";
var match = Query.Where(new BsonJavaScript("' + arg + '.indexOf(this.Name) > -1"));
不过,我认为还不能将BsonJavaScript对象与LINQ一起使用。您需要使用动态表达式生成器:

var results = collection.Find(match);

将字符串拆分为单个值的数组,以使LINQ能够使用$in高效地执行查询:


这对样本数据不起作用。他需要的正则表达式是倒排的——是字符串中的名称,需要从字段中存储的值构建正则表达式。
string arg = "xxx ccc vvvv";
var match = from d in collection.AsQueryable<AAA>()
            where arg.Split().Contains(d.name)
            select d;