c#mongodb区分大小写搜索

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

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

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

我的查询看起来像

var filter = Builders.Filter.And( Builders.Filter.Eq(u => u.Email, email), Builders.Filter.Eq(u => u.Password, password)); ME_User foundUser = null; var options = new FindOptions { 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; } } 

我有一个混乱的问题,杀了我,但我不能允许自己用小写字母再次保存这些数据并且有两份同样的东西。 此外,我希望电子邮件保存完好,就像用户插入它一样。

对Mongodb中的字符串字段进行过滤是区分大小写的,而不使用正则表达式。 为什么你不能使用正则表达式?

您的查询可以像这样编辑:

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

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

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

在C#中,您将使用文本filter:

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

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

OR下的其他非TEXT条款也必须编入索引

我更喜欢使用Linq。

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