【问题标题】:C# Mongodb. Sum field for all documentsC# MongoDB。所有文档的总和字段
【发布时间】:2017-09-19 17:12:49
【问题描述】:

我需要计算集合中所有文档的总数。比如我有以下三个文件:

_id: 1,
clientId: 1,
cash: 500

_id: 2,
clientId: 1,
cash: 100

_id: 3,
clientId: 2,
cash: 200

所以,我想对特定 clientIdcash 字段求和。对于客户 1,我想获得 600,对于客户 2,我想获得 200。这是我第一次使用 MongoDB 中的聚合框架。我检查了来自 SO 的文档和其他问题,但不知道为什么我必须使用 group 子句。如果只是想求和,我为什么需要它。我尝试使用Group,但无法编译:

_collection.Aggregate().Match(t=>t.ClientId == 1).Group(null, g => new
            {
                Total = g.Sum(o => o.Cash)
            });

方法 'Group' 没有重载需要 2 个参数

附言。我不想使用BsonDocument$sum 之类的关键字。我想用更多的 C# 方式来制作它。

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    这样好吗?

    var Total = _collection.AsQueryable().Where(x => x.ClientId == 2).Sum(x => x.Cash);
    

    编辑:聚合在这里是多余的,但它可能会像这样:

    var x = MongoCollection.Aggregate()
                        .Group(
                                doc => doc.clientId,
                                group => new
                                {
                                    clientId = group.Key,
                                    Total = group.Sum(y => y.sum)
                                }
                        ).ToList().FirstOrDefault(c => c.clientId == 2).Total;
    

    聚合在 Db 中执行,直到它进入 toList()

    【讨论】:

    • 一般来说是的,但是我想看看如何通过聚合框架完成这项任务。 BTW,你提供的代码,是在数据库中执行还是在内存中执行?
    • 我很抱歉使用不同的变量名,但我想你明白了。我认为@Skami 关于在 db 中执行的第一个解决方案是正确的。
    • @BOR4。是的,我设法通过 mysel 修复它,我的代码是相同的。 Insdead of ToList()... 我尝试使用Project 进行投影,但出现异常,但这是另一回事。谢谢。
    • @user348173 随时朋友,很高兴我能提供帮助。
    • 您还可以使用 Match 作为第一步过滤聚合,这样您就只有一个结果。第一个选项在内存中执行求和,这并不理想。
    猜你喜欢
    • 2022-12-04
    • 2021-11-27
    • 2023-01-13
    • 2022-11-24
    • 2020-10-08
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多