MongoDB C#驱动程序,使用regex通过数组元素进行查询
本文关键字:数组元素 查询 regex 驱动程序 使用 MongoDB | 更新日期: 2023-09-27 17:59:45
我使用的是MongoDB C#驱动程序版本2.2。我的集合包含"Parent"对象。每个父对象都有一组子对象。每个孩子都有名称值:
"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.*"))
我现在正在使用以下内容:
builder.AnyEq("parent.children.name", new BsonRegularExpression(".*ob.*"))
无法在此机器上测试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();
我已经在家里的数据库上测试了您当前的表达式(builder.AnyEq("parent.children.name", new BsonRegularExpression(".*ob.*")
),我认为它不会按照您想要的方式运行。
虽然c#文档没有明确说明这一点,但mongoDB支持数组字段上的Regex筛选器。我在C#中测试了下面的表达式,尽管字段是数组,但Regex的结果是正确的。
builder.Regex(MONGO_FIELD_NAME, new BsonRegularExpression("SOME REGEX"));
此外,我还在[查询数组的在线mongo-webshell]中的toy示例上测试了Regex(https://docs.mongodb.com/manual/tutorial/query-arrays/)。查询CCD_ 2将返回结果;空白";或";蓝色";尽管";标签";字段是一个数组。