c#mongodb区分大小写搜索

时间:2015-10-10 19:24:20

标签: c# mongodb mongodb-.net-driver

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

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

我正在使用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 个答案:

答案 0 :(得分:3)

对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));

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

另一种方式是文本搜索,它需要创建文本索引,并且对拉丁字母不区分大小写: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子句中使用文本索引查询,您还需要在Password字段上创建索引,否则OR查询将产生错误:

  

OR下的其他非TEXT子句也必须编入索引

答案 1 :(得分:3)

我更喜欢使用Linq。

print(re.sub(regex,lambda x: value_list[int(x.group(1))] if int(x.group(1)) < len(value_list) else x.group(), test_str))