我有一个集合,其中存储了用户的电子邮件和密码。
我显然不希望要求用户插入他的电子邮件区分大小写,并且与他第一次注册时完全相同。
我正在使用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;
}
}
我有一个混乱的问题,杀了我,但我不能允许自己用小写字母再次保存这些数据,并且有两份相同的东西。此外,我希望电子邮件能够像用户插入一样完全保存。
答案 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))