使用C# MongoDB驱动通过ID关联集合查询指定用户的Car记录
MongoDB C# Driver 关联查询实现
你这个场景有两种成熟实现,优先选第一种,性能更好。
方案1:两次查询(生产环境首选)
MongoDB本身对跨集合JOIN的支持性能不如关系型数据库,绝大多数场景下拆成两次查询效率最高:
- 先从中间表
UserCars查出指定用户绑定的所有CarId - 用拿到的Id列表批量从
Cars集合查对应车辆记录
可直接运行的代码:
int targetUserId = 1234; // 查用户关联的所有车辆ID var carIds = userCars.Find(uc => uc.UserId == targetUserId) .Project(uc => uc.CarId) .ToList(); // 无关联数据直接返回空列表 List<Car> carsJoined; if (!carIds.Any()) { carsJoined = new List<Car>(); } else { // 批量查车辆,In查询命中主键索引性能极高 carsJoined = cars.Find(c => carIds.Contains(c.Id)).ToList(); }
优化提示:给UserCars集合的UserId字段加单字段升序索引,整个查询可以完全走索引完成,延迟比聚合JOIN低50%以上。
方案2:$lookup聚合关联(单次查询)
如果需要单次请求完成关联逻辑,可以用MongoDB聚合管道的$lookup操作符实现类似SQL LEFT JOIN的效果,代码如下:
int targetUserId = 1234; List<Car> carsJoined = userCars.Aggregate() // 先过滤指定用户的关联记录 .Match(uc => uc.UserId == targetUserId) // 关联Cars集合 .Lookup( foreignCollectionName: "Cars", localField: nameof(UserCar.CarId), foreignField: nameof(Car.Id), @as: "LinkedCar" ) // 关联结果是数组,拆成单文档 .Unwind("LinkedCar") // 替换根节点为车辆文档,直接返回Car类型 .ReplaceRoot<Car>("$LinkedCar") .ToList();
注意:聚合关联的性能低于两次查询的方案,仅在需要同时处理中间表额外字段、做复杂聚合统计时使用。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

