使用C#测试MongoDB的Lookup关联查询,JoinResult结果始终为空
问题分析与解决
核心错误点及修复方案
集合名称参数错误
Lookup方法的foreignCollectionName参数你填的是变量名"BuildCaseTwoCollection",但实际MongoDB中的目标集合名称是"BuildCaseTwo"(和你获取集合时传入的名称一致),这会导致驱动找不到关联集合,直接返回空的JoinResult。实体类需包含关联结果属性
确保ExpertCase类中定义了JoinResult属性,类型为集合类型(比如List<BuildCaseTwo>),否则MongoDB驱动无法将关联结果反序列化到对象中。字段类型一致性检查
确认ExpertCase和BuildCaseTwo类中的CaseID字段类型一致,从你的数据来看都是字符串类型,所以实体类中CaseID需定义为string,避免因类型不匹配导致关联失败。
修正后的代码示例
MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("Test"); var ExpertCaseCollection = db.GetCollection<ExpertCase>("ExpertCase"); var BuildCaseTwoCollection = db.GetCollection<BuildCaseTwo>("BuildCaseTwo"); var q = ExpertCaseCollection.Aggregate() .Match(Builders<ExpertCase>.Filter.Eq(u => u.SelfMail, "111@yahoo.com.tw")) // 精确匹配邮箱用Eq更合适 .Lookup( foreignCollectionName: "BuildCaseTwo", // 修正为实际集合名称 localField: "CaseID", foreignField: "CaseID", @as: "JoinResult"); var lzToLost = q.ToList();
实体类示例
public class ExpertCase { public ObjectId _id { get; set; } public string SelfMail { get; set; } public string ProposerMail { get; set; } public string CaseID { get; set; } public string Date { get; set; } // 必须定义该属性接收关联查询结果 public List<BuildCaseTwo> JoinResult { get; set; } } public class BuildCaseTwo { public ObjectId _id { get; set; } public string SelfMail { get; set; } public string JoinExpert { get; set; } public string CaseID { get; set; } public string CaseTiele { get; set; } public string Date { get; set; } }
内容的提问来源于stack exchange,提问作者Peter Lo
相关产品推荐
相关产品推荐

