You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:50:56