You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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();

代码解释

  1. $objectToArray:把Aliases这个动态键对象转换成数组结构,每个元素包含k(键名)和v(子节点内容)两个字段。
  2. $map:遍历转换后的数组,对每个子节点的v.FullName执行正则匹配,生成一个布尔值数组(匹配为true,不匹配为false)。
  3. $anyElementTrue:检查布尔数组中是否存在至少一个true,也就是判断是否有任意一个别名的FullName包含"CONST"。

这种方式不需要提前知道Aliases下的子键名称,完全动态地处理所有可能的子节点,刚好满足你的需求。

内容的提问来源于stack exchange,提问作者Luis Matos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:58:12