如何使用C# MongoDB强类型驱动计算指定作者书籍的平均价格
用MongoDB C#驱动2.7.0计算指定作者书籍的平均价格
嗨,我来帮你搞定这个需求!要通过作者ID获取该作者所有书籍的平均价格,咱们用MongoDB的聚合框架就能轻松实现,而且驱动2.7.0版本完全支持强类型的LINQ写法,代码可读性拉满。
先给你完整的实现代码,你可以直接参考:
// 初始化Mongo客户端和集合 var client = new MongoClient(ConnectionString); var database = client.GetDatabase("YourDatabaseName"); // 替换成你的数据库名称 var booksCollection = database.GetCollection<Book>("Books"); // 替换成你的书籍集合名称 // 目标作者ID(替换成你实际要查询的ID) string targetAuthorId = "your-target-author-id"; // 构建聚合管道计算平均价格 var aggregationResult = await booksCollection.Aggregate() // 第一步:筛选出该作者的所有书籍 .Match(book => book.AuthorId == targetAuthorId) // 第二步:将筛选后的书籍分组,计算平均价格 .Group( _ => 1, // 因为已经筛选了特定作者,用固定值分组即可把所有结果归为一组 groupedBooks => new { AveragePrice = groupedBooks.Average(book => book.Price) } ) // 获取结果(如果没有匹配的书籍,会返回null) .FirstOrDefaultAsync(); // 处理无匹配结果的情况,返回默认值0.0,你也可以根据需求调整 double averagePrice = aggregationResult?.AveragePrice ?? 0.0;
代码解释:
- Match阶段:先把数据库中属于目标作者的书籍筛选出来,减少后续计算的数据量,提升效率。
- Group阶段:这里用
_ => 1作为分组键,因为我们已经过滤出了特定作者的书籍,所以所有符合条件的文档都会被分到同一组里,然后通过groupedBooks.Average(book => book.Price)直接计算该组内书籍价格的平均值。 - 结果处理:如果该作者没有任何书籍,
FirstOrDefaultAsync()会返回null,这时候我们用空合并运算符??返回0.0作为默认值,你也可以根据业务需求改成其他逻辑(比如抛出异常)。
如果你更习惯用原生的BsonDocument写法(比如需要更复杂的聚合逻辑时),也可以这样写:
var pipeline = new BsonDocument[] { new BsonDocument("$match", new BsonDocument("AuthorId", targetAuthorId)), new BsonDocument("$group", new BsonDocument { { "_id", 1 }, { "AveragePrice", new BsonDocument("$avg", "$Price") } }) }; var resultDoc = await booksCollection.Aggregate<BsonDocument>(pipeline).FirstOrDefaultAsync(); double averagePrice = resultDoc != null ? resultDoc["AveragePrice"].AsDouble : 0.0;
两种写法都能实现需求,强类型LINQ写法更贴合C#的编码习惯,推荐优先使用~
内容的提问来源于stack exchange,提问作者Waxren
相关产品推荐
相关产品推荐

