我正在使用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.*"))
答案 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 webshell](https://docs.mongodb.com/manual/tutorial/query-arrays/)中的玩具示例中测试了Regex。尽管{tag“字段是一个数组,但查询db.inventory.find({tags : {$regex : "^bl"}}
将返回带有“空白”或“蓝色”的结果。