MongoDB C#驱动程序,使用正则表达式

时间:2016-08-01 12:40:48

标签: c# mongodb linq

我正在使用MongoDB C#驱动程序版本2.2 。我的收藏包含"家长"对象。每个父对象都有一个子对象数组。每个孩子都有名字值:

"parent": {
    "children":[
        { "name": "Bob", "age": 10},
        { "name": "Alice", "age": 7},
        { "name": "Tobias", "age": 11}
    ]
}

我需要将以下代码翻译成C#语句/ LINQ语法:

db.getCollection('Parents').find({'parent.children': { $elemMatch: { 'name': { $regex: '.*ob.*', $options: 'im' } }}})

我发现有像

这样的方法
var builder = Builders<BsonDocument>.Filter;
builder.Regex("parent.children.name", new BsonRegularExpression(".*ob.*")); //does not work with array

builder.AnyEq("parent.children.name", "ob"); //without regex

但我无法理解如何将它们结合起来。请指教。

更新

我现在正在使用以下内容,如果你知道它不能正常工作的原因,请纠正我:

builder.AnyEq("parent.children.name", new BsonRegularExpression(".*ob.*"))

3 个答案:

答案 0 :(得分:1)

我现在正在使用以下内容:

builder.AnyEq("parent.children.name", new BsonRegularExpression(".*ob.*"))

答案 1 :(得分:0)

无法在此计算机上测试C#。如果这不起作用,请告诉我:

var filter = Builders<People>.Filter.ElemMatch(x => x.Parent.Children, x => Regex.IsMatch(x.Name, "regex"));
var res = await collection.Find(filter).ToListAsync();

这是你可能喜欢的技巧:

// Take your inputted `find` query string:
string bsonQuery = "{'parent.children': { $elemMatch: { 'name': { $regex: '.*ob.*', $options: 'im' } }}}";

// Use it as the filter!
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bsonQuery);

// Results:
var result = col.FindSync (filter).ToList();

答案 2 :(得分:0)

我已经在家中的一个数据库上测试了您当前的表达式(builder.AnyEq("parent.children.name", new BsonRegularExpression(".*ob.*")),但我认为它的表现与您的预期不符。

Although the c# documentation doesn't explicitly state this,mongoDB在数组字段上支持Regex过滤器。我已经在C#中测试了以下表达式,并且尽管该字段是数组,但对于Regex却具有正确的结果。

builder.Regex(MONGO_FIELD_NAME, new BsonRegularExpression("SOME REGEX"));

此外,我已经在[用于查询数组的在线mongo webshel​​l](https://docs.mongodb.com/manual/tutorial/query-arrays/)中的玩具示例中测试了Regex。尽管{tag“字段是一个数组,但查询db.inventory.find({tags : {$regex : "^bl"}}将返回带有“空白”或“蓝色”的结果。