如何用C# MongoDB.Driver搜索动态子节点内的字段(正则)
解决方案:查询MongoDB动态子节点字段的正则匹配
嘿,针对你这个动态键的查询需求,其实可以借助MongoDB的聚合表达式来实现,因为普通的字段路径查询没法处理Aliases这种键名不固定的对象结构。下面是最简单的C#实现方式:
核心思路
我们需要把Aliases对象转换成数组(用$objectToArray),然后遍历数组中的每个子节点,检查其FullName是否匹配目标正则,最后判断是否存在至少一个匹配项即可。
C# 代码实现
假设你的实体类定义类似这样:
public class Company { public string Id { get; set; } public string _t { get; set; } public string ActiveFrom { get; set; } public string ActiveTo { get; set; } public string GroupId { get; set; } public string Key { get; set; } public string FullName { get; set; } public List<string> Countries { get; set; } public string MoreInfo { get; set; } public string RecordDetail { get; set; } public Dictionary<string, AliaseItem> Aliases { get; set; } } public class AliaseItem { public string Key { get; set; } public string FullName { get; set; } public string OriginalKey { get; set; } }
对应的查询代码如下:
// 创建正则匹配条件,这里用"CONST"作为匹配目标,可选添加忽略大小写的"i"选项 var regexFilter = new BsonDocument("$regexMatch", new BsonDocument { { "input", "$$alias.value.FullName" }, { "regex", "CONST" }, { "options", "i" } // 若不需要忽略大小写,可删除此行 }); // 构建动态子节点的查询逻辑 var filter = Builders<Company>.Filter.Expr( new BsonDocument("$anyElementTrue", new BsonArray { new BsonDocument("$map", new BsonDocument { // 将Aliases对象转为[{k: "键名", v: "子节点内容"}]的数组 { "input", new BsonDocument("$objectToArray", "$Aliases") }, { "as", "alias" }, // 遍历数组,对每个子节点的FullName执行正则匹配,返回布尔值数组 { "in", regexFilter } }) }) ); // 执行查询 var matchedCompanies = await yourMongoCollection.Find(filter).ToListAsync();
代码解释
- $objectToArray:把
Aliases这个动态键对象转换成数组结构,每个元素包含k(键名)和v(子节点内容)两个字段。 - $map:遍历转换后的数组,对每个子节点的
v.FullName执行正则匹配,生成一个布尔值数组(匹配为true,不匹配为false)。 - $anyElementTrue:检查布尔数组中是否存在至少一个
true,也就是判断是否有任意一个别名的FullName包含"CONST"。
这种方式不需要提前知道Aliases下的子键名称,完全动态地处理所有可能的子节点,刚好满足你的需求。
内容的提问来源于stack exchange,提问作者Luis Matos
相关产品推荐
相关产品推荐

