Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在mongo db驱动程序c中使用$in子句进行不敏感搜索#_C#_Mongodb_Mongodb Query_Mongodb .net Driver - Fatal编程技术网

C# 在mongo db驱动程序c中使用$in子句进行不敏感搜索#

C# 在mongo db驱动程序c中使用$in子句进行不敏感搜索#,c#,mongodb,mongodb-query,mongodb-.net-driver,C#,Mongodb,Mongodb Query,Mongodb .net Driver,我想知道如何在表达式中使用$in不区分大小写 根据官方MongoDB手册,您可以执行以下操作: { name: { $in: [ /^acme/i, /^ack/ ] } } 我在指南针上测试了这个,它工作正常,搜索不灵敏 我需要使用C#中的Mongo驱动程序来解决这个问题 我正在这样做: var array = new BsonArray(companyNames); var filter = new BsonDocument { { "Name", new BsonDocumen

我想知道如何在表达式中使用$in不区分大小写

根据官方MongoDB手册,您可以执行以下操作:

{ name: { $in: [ /^acme/i, /^ack/ ] } }
我在指南针上测试了这个,它工作正常,搜索不灵敏

我需要使用C#中的Mongo驱动程序来解决这个问题

我正在这样做:

  var array = new BsonArray(companyNames);

  var filter = new BsonDocument { { "Name", new BsonDocument { { "$in", new BsonArray(array) }} } };
  var result = _collection.Find(filter).ToList();
companyNames是一个字符串[]

但是,这只检索完全匹配的内容。这有点明显,因为我没有包含“regex”表达式。但我不知道如何将正则表达式包含在字符串中

解决方法是为每个公司名称创建一个带有regex的$or表达式

有人知道怎么做吗

谢谢,您可以利用。您可以执行以下操作之一:

var arrayIn = new BsonArray().Add(
                      new BsonRegularExpression("^acme", "i")
                  ).Add(
                      new BsonRegularExpression("^ack"));
var filter = new BsonDocument { { "name", new BsonDocument { { "$in", arrayIn }} } };
var cursor = collection.Find(filter).ToList();
或者,代替
string
使用和:


这是一个优雅的解决方案,在company name字段上使用文本索引

使用MongoDB.Entities;
命名空间堆栈溢出
{
班级计划
{
上市公司:实体
{
公共字符串名称{get;set;}
}
静态void Main(字符串[]参数)
{
新DB(“测试”);
DB.Index()
.Key(c=>c.Name,KeyType.Text)
.Option(o=>o.Background=false)
.Create();
var c1=新公司{Name=“Ackme”};
var c2=新公司{Name=“Acme”};
var c3=新公司{Name=“Lackme”};
var c4=新公司{Name=“Hackme”};
c1.Save();c2.Save();c3.Save();c4.Save();
var name=new[]{“ackme”,“acme”};
var result=DB.SearchText(string.Join(“,name));
}
}
}

请注意,以上使用的是便利库。但是,概念是相同的,但是官方驱动程序的语法与上面的相比很麻烦。

我的解决方案是一个重载的
。In()
作为扩展方法,为大小写不敏感使用一个额外的参数:

public static class MongoExtensions
{
    public static FilterDefinition<TDocument> In<TDocument>(
        this FilterDefinitionBuilder<TDocument> builder,
        Expression<Func<TDocument, object>> expr,
        IEnumerable<string> values,
        bool ignoreCase)
    {
        if (!ignoreCase)
        {
            return builder.In(expr, values);
        }

        var filters = values
            .Select(v => builder.Regex(expr, new BsonRegularExpression($"^{Regex.Escape(v)}$", "i")));

        return builder.Or(filters);
    }
}
公共静态类MongoExtensions
{
中的公共静态筛选器定义(
此FilterDefinitionBuilder,
表达式表达式,
IEnumerable value,
布尔格诺尔案)
{
如果(!ignoreCase)
{
返回builder.In(表达式,值);
}
变量过滤器=值
.Select(v=>builder.Regex(expr,新的BsonRegularExpression($“^{Regex.Escape(v)}$”,“i”));
返回生成器。或(过滤器);
}
}
然后你可以简单地:

var filter = Builders<Companies>.Filter.In(c => c.Name, companyNames, true);
var result = _collection.Find(filter).ToList();
var filter=Builders.filter.In(c=>c.Name,companyNames,true);
var result=_collection.Find(filter.ToList();

请记住,一个集合只能有一个文本索引。()
var filter = Builders<Companies>.Filter.In(c => c.Name, companyNames, true);
var result = _collection.Find(filter).ToList();