【问题标题】:c# mongodb case sensitive search时间:2019-04-10 标签:c#mongodb casesensitive search
【发布时间】:2015-10-10 19:24:20
【问题描述】:

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

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

我正在使用 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 个相同的东西的副本。另外,我希望保存的电子邮件完全像用户插入它一样。

【问题讨论】:

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


    【解决方案1】:

    在 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 子句中的文本索引查询,您还需要在 Password 字段上创建索引,否则 OR 查询将产生错误:

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

    【讨论】:

    • 是的,我的意思不是正则表达式,因为我看到人们编写整个字符串对象而不使用实际的 2.0 驱动程序。太完美了!
    • 效果很好!正则表达式再次拯救了这一天。
    【解决方案2】:

    我更喜欢使用 Linq。

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

    【讨论】:

    • 是的,这似乎有效。我想你应该投赞成票.. 但这是最​​有效的方法吗?如果我有 200+ 百万份文档怎么办?
    • @ppumkin 我不知道这是否是您必须对其进行基准测试的最有效方法。另一方面,对我来说,它更具可读性。您是否计划拥有 200+ 百万用户?我可以买一些股票吗? :)
    • 嗯 - 哈哈,我希望。不,我正在从这个游戏 PathOfExile 中索引文档,我现在有一个数据子集,5000 万个文档。我已经尝试过 Elastic、RavenDB、MongoDB 来看看哪个是最快的。 MongoDB 对我来说是最糟糕的。50 秒的相同查询弹性只有 0.2 秒——嗯,是吗?!但是弹性查询非常怪异,有时还会遭受 50 秒的响应时间(但只是有时)。也许我做错了? :D 我不知道
    • 我浪费了很多时间,因为我使用了 .Equals() 不支持但 == 支持。感谢您的回答
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2022-01-16
      • 2018-07-04
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多