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

使用MongoDB Driver .NET Core嵌套关联子对象问题求助

问题解决方案

原代码的核心问题是第二个Lookup的关联字段错误:SampleId是Template文档的字段,而非Instance的字段,而且第一次Lookup后Template是数组,必须先展开才能处理嵌套的关联逻辑。

修正后的聚合查询步骤如下:

  1. 先通过Lookup关联Template集合,将匹配的模板数据存入Template数组;
  2. 用Unwind展开Template数组(每个实例对应一个模板,展开后得到单个Template对象);
  3. 基于展开后的Template.SampleId,再次用Lookup关联Sample集合,将匹配的样本数据存入Template.Sample数组;
  4. 最后展开Template.Sample数组,得到嵌套的完整对象结构。

修正后的代码:

public class Instance
{
    public long IId { get; set; }
    public string Name { get; set; }
    public long TemplateId { get; set; }
    public Template Template { get; set; }
}

public class Template
{
    public long TId { get; set; }
    public string Name { get; set; }
    public long SampleId { get; set; }
    public Sample Sample { get; set; }
}

public class Sample
{
    public long SId { get; set; }
    public string Name { get; set; }        
}

string connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);

var db = client.GetDatabase("test");
var instances = db.GetCollection<Instance>("Instances");

var resultOfJoin = instances.Aggregate()
    // 关联Template集合,得到Template数组
    .Lookup("Templates", "TemplateId", "TId", @as: "Template")
    // 展开Template数组,转为单个对象
    .Unwind("Template")
    // 基于Template.SampleId关联Sample集合,存入Template.Sample数组
    .Lookup("Samples", "Template.SampleId", "SId", @as: "Template.Sample")
    // 展开Template.Sample数组,转为单个对象
    .Unwind("Template.Sample")
    .As<Instance>()
    .ToList();

额外说明:

  • 确保MongoDB中的集合名称正确(原代码里写的"Template"和"Sample",通常集合名是复数形式,比如"Templates"、"Samples",如果你的集合名是单数,对应修改即可);
  • 如果每个Template必然对应一个Sample,可以添加preserveNullAndEmptyArrays: false到Unwind参数中,过滤掉没有匹配样本的模板数据。

内容的提问来源于stack exchange,提问作者Rushi Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:25:24