【问题标题】:Mongo C# driver - Contains FilterMongo C# 驱动程序 - 包含过滤器
【发布时间】:2015-08-21 10:58:11
【问题描述】:

我正在使用最新版本的 Mongo C# 驱动程序,它使用了很多异步和构建器模式。这很好。我正在尝试将 SQL where 子句转换为 Mongo FilterDefinition 对象。

知道如何处理“包含”吗?
喜欢:

where x contains 'ABC'

【问题讨论】:

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


    【解决方案1】:

    为了在 V2 API 中实现这一点,请使用 `Filter.Regex':

    var collection = db.GetCollection<BsonDocument>("collection");
    
    var filter = Builders<BsonDocument>.Filter.Regex("fieldName", new BsonRegularExpression(".*fieldValue.*"));
    
    var data = await (await coll.FindAsync<BsonDocument>(filter).ConfigureAwait(false)).ToListAsync();
    
    //continue process data 
    

    【讨论】:

      【解决方案2】:

      如果x 是一个字符串,您可以使用简单的正则表达式来实现。对于2.0驱动,可以手动创建FilterDefinition

      FilterDefinition<BsonDocument> filter = "{ x : { $regex : /ABC/ } }";
      

      或者使用Builder构建过滤器:

      var builder = Builders<BsonDocument>.Filter;
      var filter = builder.Matches("x", "ABC");
      

      然后您可以在查询中使用过滤器:

      using (var cursor = await collection.Find(filter).ToCursorAsync())
      {
          // ...
      }
      

      【讨论】:

      • 谢谢!我正在使用 2.0 版本的驱动程序,无法在 Filter Builder 上使用 .Matches(),但我可以找到 .Regex(),所以我会尝试一下。
      【解决方案3】:

      首先,我强烈推荐使用MongoDB University's .NET course(来自 Mongo 本身)。它非常彻底,并且深入涵盖了您的问题(以及更多问题)。

      其次,我假设 x 在您的示例中是一个数组。

      MongoDB 正确处理数组的多态性。如果你有一个类Post 的数组为Tags,你可以过滤Tag = ABC 的位置。

      如果您使用 C# linq 方法,则看起来像 .Find(p =&gt; p.Tags == "ABC")。如果您使用的是BsonDocument,则看起来像new BsonDocument().Add("Tags", "ABC")

      【讨论】:

        【解决方案4】:

        我能够像这样使用 Filter.AnyIn 来完成这项工作

        var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });
        

        如果您也在寻找多个值,这也很有效,只需将它们添加到列表中即可。

        【讨论】:

          【解决方案5】:

          我有另一种我不喜欢的方法,但它确实有效。被标记为正确的答案是错误的一半(Matches 是 Builders 的一种方法)。在此示例中, / 就像 sql 查询 LIKE 语句中的 % 一样。我仍在寻找一种更好的方法,如果我在下面找到更多等于过滤器的方法,我会更新。

          List<yourobject> someList = await collection.Find("{ x: /Test/ }").ToListAsync();
          
          var filter = Builders<yourobject>.Filter.Eq("x", "ABC");
          List<yourobject> someList = await collection.Find(filter).ToListAsync();
          

          【讨论】:

          • 您的过滤器构建器方法不正确。它不能等于,因为您正在寻找包含。
          【解决方案6】:

          如果您只想搜索输入text,则需要替换正则表达式特殊字符。

          Regex.Escape 将确保这些字符按字面意思处理,而不是作为元字符处理。否则输入text 可用于查询可能不是必需的正则表达式模式。

          var text = "ABC";
          var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(Regex.Escape(text)));
          

          如果您需要不区分大小写的检查。然后你可以将不区分大小写的正则表达式传递给BsonRegularExpression.Create

          var text = "ABC";
          var escapeText = Regex.Escape(text);
          var regex = new Regex(escapeText, RegexOptions.IgnoreCase);
          var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(regex));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-11
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多