如何在MongoDB .NET中通过LINQ实现含嵌入字符串数组的关联查询?
使用MongoDB .NET Driver通过LINQ查询获取包含分类详情的产品
当然可以用LINQ实现这个需求!在MongoDB .NET Driver中,我们可以借助Lookup操作(对应MongoDB原生的$lookup聚合阶段)来关联Product和Categories集合,再通过LINQ语法完成投影,最终得到包含完整分类详情的产品列表。
第一步:定义实体类
首先我们需要对应MongoDB集合的实体,以及用于返回结果的DTO(因为原始Product的Categories是字符串数组,我们需要转换成分类对象集合):
// 对应Categories集合的实体 public class Category { [BsonId] public string Id { get; set; } public string Name { get; set; } } // 对应Products集合的原始实体 public class Product { [BsonId] public string Id { get; set; } public string Title { get; set; } public List<string> Categories { get; set; } } // 用于返回最终结果的DTO,包含完整分类信息 public class ProductWithCategoriesDto { public string Id { get; set; } public string Title { get; set; } public List<Category> Categories { get; set; } }
第二步:编写LINQ查询
接下来就可以用LINQ的聚合语法来关联集合并投影结果了:
// 初始化MongoDB客户端和集合 var mongoClient = new MongoClient("你的MongoDB连接字符串"); var database = mongoClient.GetDatabase("你的数据库名称"); var productsCollection = database.GetCollection<Product>("Products"); var categoriesCollection = database.GetCollection<Category>("Categories"); // 执行关联查询并投影成目标DTO var productsWithCategories = productsCollection.Aggregate() .Lookup( foreignCollection: categoriesCollection, localField: p => p.Categories, // 产品里的分类ID数组 foreignField: c => c.Id, // 分类文档的ID @as: (ProductWithCategoriesDto p) => p.Categories // 关联后填充到DTO的Categories属性 ) .Project(p => new ProductWithCategoriesDto { Id = p.Id, Title = p.Title, Categories = p.Categories }) .ToList();
关键说明
Lookup操作会自动匹配Product中Categories数组里的每个ID和Category集合中的Id字段,把匹配到的分类文档一次性嵌套到结果中。- 这里使用DTO是为了和原始Product实体区分开,如果你只是临时使用结果,也可以换成匿名类型,但DTO更利于后续业务逻辑的复用和维护。
- 执行
ToList()后,得到的结果就是你期望的包含完整分类详情的产品列表。
内容的提问来源于stack exchange,提问作者Oğuz KURTCUOĞLU
相关产品推荐
相关产品推荐

