在 MongoDB .NET 中使用 Regex 针对带有 `ElemMatch` 的简单列表

Using a Regex against a simple list with `ElemMatch` in MongoDB .NET

给定一个包含字符串列表的文档,您如何 assemble C# MongoDB 查询每个列表项的正则表达式?

例如,这里有一些数据。

{
  "_id": {
    "$oid": "4ded270ab29e220de8935c7b"
  },
  // ... some other stuff ...
  "categories": [
    {
      "Some Category",
      "Another Category",
      "Yet Another Category",
      "One Last Category"
    }
  ]
},

最终,我将如何构造一个可以通过 MonoDB LINQ 提供程序进行强类型化的查询?

{ "categories": { $elemMatch: { $regex: someSearch, $options: "i" } } }

我正在尝试使用 ElemMatch 来实现这一点,但我似乎无法构造一个 BsonRegularExpression 来使用该方法。如果数据是键控元素列表,看起来我可以为某些键工作,比如 itemName.

// Doesn't translate to a list of raw strings.
Query.ElemMatch ("categories", Query.Match("itemName", new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));

不过,当我尝试让正则表达式直接在 ElemMatch 上工作时,我无法匹配重载。

// Doesn't compile: cannot convert BsonRegularExpress to IMongoQuery.
Query.ElemMatch ("categories", new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));

有什么方法可以直接将 BsonRegularExpression 转换为 IMongoQuery 对象吗?

或者是否有一些 Matches 语法用于在允许两者混合的列表中应用当前迭代元素?类似这样的代码。

// Doesn't work: totally making this up.
Query.ElemMatch ("categories", Query.Matches (iteratorElement, new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));

我希望避免只将原始字符串发送到 MongoDB 驱动程序,这样我就可以从注入中逃脱搜索字符串,这样代码就不会乱七八糟地充满魔法字符串字段名称(而是有限的只是数据库模型字段上的 BsonElement 属性)。

这可能不是您所追求的 100%(因为它不是 IQueryable);但它确实实现了您想要的(使用 Linq 对集合进行强类型正则表达式过滤):

        var videosMongo = DbManager.Db.GetCollection<Video> ("videos");
        var videosCollection = videosMongo.AsQueryable<Video> ();
        videosMongo.Insert (new Video () {
            Id = new ObjectId (),
            Tags = new string[]{ "one", "two", "test three", "four test", "five" },
            Name = "video one"
        });
        videosMongo.Insert (new Video () {
            Id = new ObjectId (),
            Tags = new string[]{ "one", "two", "test three", "four test", "five" },
            Name = "video two"
        });
        videosMongo.Insert (new Video () {
            Id = new ObjectId (),
            Tags = new string[]{ "one", "two" },
            Name = "video three"
        });
        videosMongo.Insert (new Video () {
            Id = new ObjectId (),
            Tags = new string[]{ "a test" },
            Name = "video four"
        });


        var videos = videosCollection.Where (v => v.Name == "video four").ToList ();

        var collection = DbManager.Db.GetCollection<Video> ("videos");
        var regex = new BsonRegularExpression ("test");
        var query = Query<Video>.Matches (p => p.Tags, regex);
        var results = collection.Find (query).ToList ();

我使用这里的优秀资源解决了这个问题:http://www.layerworks.com/blog/2014/11/11/mongodb-shell-csharp-driver-comparison-cheat-cheet