使用MongoDB Driver .NET Core嵌套关联子对象问题求助
问题解决方案
原代码的核心问题是第二个Lookup的关联字段错误:SampleId是Template文档的字段,而非Instance的字段,而且第一次Lookup后Template是数组,必须先展开才能处理嵌套的关联逻辑。
修正后的聚合查询步骤如下:
- 先通过
Lookup关联Template集合,将匹配的模板数据存入Template数组; - 用
Unwind展开Template数组(每个实例对应一个模板,展开后得到单个Template对象); - 基于展开后的
Template.SampleId,再次用Lookup关联Sample集合,将匹配的样本数据存入Template.Sample数组; - 最后展开
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
相关产品推荐
相关产品推荐

