c# mongodb 区分大小写的搜索

c# mongodb case sensitive search

我有一个集合,其中存储了用户的电子邮件和密码。

我显然不想要求用户插入他的电子邮件区分大小写并且与他第一次注册时完全一样。

我正在使用 mongodb 2.0 c# 驱动程序,我重复它是因为我看到了用正则表达式编写的查询解决方案,但恐怕我不能在这里使用它。

我的查询看起来像

var filter = Builders<ME_User>.Filter.And(
                                 Builders<ME_User>.Filter.Eq(u => u.Email, email),
                                 Builders<ME_User>.Filter.Eq(u => u.Password, password));
            ME_User foundUser = null;
            var options = new FindOptions<ME_User>
            {
                Limit = 1
            };
            using (var cursor = await manager.User.FindAsync(filter, options))
            {
                while (await cursor.MoveNextAsync())
                {
                    var batch = cursor.Current;
                    foreach (ME_User user in batch)
                        foundUser = user;
                }
            }

我有一个混乱的问题,杀了我,但我不能让自己用小写再次保存这个数据,并且有 2 个相同的副本。另外,我希望电子邮件的保存方式与用户插入的完全一样。

Mongodb 中的字符串字段过滤区分大小写,无需使用正则表达式。为什么不能使用正则表达式?

您的查询可以这样编辑:

var filter = Builders<ME_User>.Filter.And(
Builders<ME_User>.Filter.Regex(u => u.Email, new BsonRegularExpression("/^" + email + "$/i"), 
Builders<ME_User>.Filter.Eq(u => u.Password, password));

请注意“^”和“$”符号以指定完整的单词搜索,最重要的是正则表达式末尾的不区分大小写的运算符(“/i”)。

另一种方法是文本搜索,它需要创建文本索引并且对拉丁字母不区分大小写:http://docs.mongodb.org/manual/reference/operator/query/text/#match-operation

在 C# 中,您将与文本过滤器一起使用:

var filter = Builders<ME_User>.Filter.And(
Builders<ME_User>.Filter.Text(email), 
Builders<ME_User>.Filter.Eq(u => u.Password, password));

在 OR 子句中使用文本索引查询,您还需要在密码字段上创建索引,否则 OR 查询将产生错误:

Other non-TEXT clauses under OR have to be indexed as well

我更喜欢使用 Linq。

var match = theCollection.AsQueryable().SingleOrDefault(x =>
    x.Email.ToLower() == emailToSearchFor.ToLower());

对于 c# 驱动程序 2.1 (MongoDB 3.0) 默认情况下区分大小写。 要不区分大小写,只需在 BsonRegularExpression 中添加“i”。请参考以下内容

  var filter = Builders<Users>.Filter.Regex(k=>k.Name, new BsonRegularExpression(name, "i"));

  var users = await _mongoDbContext.Users.Find(filter).ToListAsync();