Mongo C#驱动Lookup关联时ObjectId与string类型不匹配如何解决?
问题根因
你使用的四参数Lookup重载仅支持直接指定两个集合的关联字段名,无法传入类型转换的聚合表达式,你传入的{{$toString: $_id}}会被驱动识别为普通字段名,因此无法匹配到数据。
解决方案
不需要完全切换为纯BSON文档写法,两种实现方式均可满足需求:
方案1:Fluent API混合轻量BSON写法(兼容性最好)
使用MongoDB 3.6+支持的带let和自定义Pipeline的Lookup重载即可实现,MongoDB.Driver v2.11.5完全支持该语法。
如果你的字符串ID都是合法的ObjectId格式,推荐将本地字符串转为ObjectId进行匹配,可以利用User集合_id的默认索引,性能更好:
var result = collection1.Aggregate() .Lookup<BsonDocument>( foreignCollectionName: "user", let: new BsonDocument("userIds", "$users"), lookupPipeline: new BsonDocument[] { new BsonDocument("$match", new BsonDocument("$expr", new BsonDocument("$in", new BsonArray { "$_id", new BsonDocument("$map", new BsonDocument { { "input", "$$userIds" }, { "in", new BsonDocument("$toObjectId", "$$this") } }) }) )) }, as: "userDocs" ) .ToList();
如果存在部分字符串ID不符合ObjectId格式的场景,可以将User的_id转为字符串匹配:
var result = collection1.Aggregate() .Lookup<BsonDocument>( foreignCollectionName: "user", let: new BsonDocument("userIds", "$users"), lookupPipeline: new BsonDocument[] { new BsonDocument("$match", new BsonDocument("$expr", new BsonDocument("$in", new BsonArray { new BsonDocument("$toString", "$_id"), "$$userIds" }) )) }, as: "userDocs" ) .ToList();
方案2:纯强类型Fluent写法
如果不想写任何BSON格式代码,可以先定义对应实体类,驱动会自动解析表达式中的类型转换逻辑:
// 定义实体类 public class Collection1Item { public ObjectId Id { get; set; } public List<string> Users { get; set; } } public class User { public ObjectId Id { get; set; } public string Field1 { get; set; } public string Field2 { get; set; } } public class Collection1WithUsers : Collection1Item { public List<User> UserDocs { get; set; } } // 执行查询 var collection1 = db.GetCollection<Collection1Item>("Collection1"); var userCollection = db.GetCollection<User>("user"); var result = collection1.Aggregate() .Lookup<Collection1Item, User, Collection1WithUsers>( foreignCollection: userCollection, localField: x => x.Users.Select(id => ObjectId.Parse(id)), foreignField: y => y.Id, asField: x => x.UserDocs ) .ToList();
注:如果遇到驱动无法解析ObjectId.Parse表达式的情况,回退到方案1即可。
内容的提问来源于stack exchange,提问作者kenswdev
相关产品推荐
相关产品推荐

