MongoDB 的分组操作

1、MapReduce方式

        public static List<vm_rankingModel> GetBangZhuanList(List<int> memberIds)
        {
            var ids = memberIds.ConvertAll<BsonValue>(x => x);
            //筛选字段
            IMongoQuery query = Query.And(Query.In("member_id", ids), Query.EQ("mark", 1));

            MongoCollection<BsonDocument> myCollection = MongoDBHelper.GetCollection("mstg_record_history");

            //GroupBy的字段
            GroupByBuilder groupbyBuilder = new GroupByBuilder(new string[] { "member_id" });

            Dictionary<string, double> dic_M = new Dictionary<string, double>();
            dic_M["msum"] = 0.0;
            var result_M = myCollection.Group(query, groupbyBuilder, BsonDocument.Create(dic_M),
                                            BsonJavaScript.Create("function(obj,prev){prev.msum += obj.price;}"),
                                            BsonJavaScript.Create("function(obj){obj.sum=obj.msum;delete obj.sum;}")).ToList();

            List<vm_rankingModel> result = new List<vm_rankingModel>();
            if (result_M != null && result_M.Count > 0)
            {
                foreach (var item in result_M)
                {
                    double amount = Math.Round(Convert.ToDouble(item["msum"]), 2);
                    result.Add(new vm_rankingModel
                    {
                        member_id = Common.StringHelper.StrToInt(item["member_id"].ToString()),
                        amount = amount
                    });
                }
            }

            result = result.OrderByDescending(x => x.amount).ToList();

            return result;
        }

2、用Aggregate实现

public static List<vm_rankingModel> GetRankingList(int top)
        {
            MongoCollection<BsonDocument> myCollection = MongoDBHelper.GetCollection("mstg_record_history");

            //分组获取金额总数
            var group = new BsonDocument 
                { 

                    { "$group", 
                        new BsonDocument 
                            { 
                                { "_id", new BsonDocument 
                                             { 
                                                 { 
                                                     "MemberId","$member_id" 
                                                 } 
                                             } 
                                }, 
                                { 
                                    "Count", new BsonDocument 
                                                 { 
                                                     { 
                                                         "$sum", "$price" 
                                                     } 
                                                 } 
                                } 
                            } 
                  } 
                };
            //筛选条件
            var match = new BsonDocument 
                { 
                    { 
                        "$match", 
                        new BsonDocument 
                            { 
                                {"mark", 1}
                            } 
                    } 
                };

            var pipeline = new[] { match, group };
            var list = myCollection.Aggregate(pipeline);

            var matchingExamples = list.ResultDocuments
            .Select(x => x.ToDynamic())
            .ToList();
            List<vm_rankingModel> result = new List<vm_rankingModel>();
            if (matchingExamples.Count > 0)
            {
                foreach (var example in matchingExamples)
                {
                    int member_id = Convert.ToInt32(example._id.MemberId.Value);
                    double amount = Math.Round(example.Count.Value, 2);
                    result.Add(new vm_rankingModel
                    {
                        member_id = member_id,
                        amount = amount
                    });
                }
            }
            
            result = result.OrderByDescending(x => x.amount).Take(top).ToList();

            return result;
        }

注意:分组查询不支持分片数据库。。。。

MongoDB中,分组操作可以通过使用聚合管道来实现。聚合管道是一系列的阶段,每个阶段都会对输入的文档进行处理,并将结果传递给下一个阶段。 例如,可以使用$group操作符来分组文档。在分组操作中,可以根据指定的字段对文档进行分组,并对每个分组进行统计、计算等操作。以下是一个示例: db.collection.aggregate([ { $group: { _id: "$fieldname", count: { $sum: 1 } } } ]) 在上面的示例中,$group操作符用于按fieldname字段对文档进行分组分组后,可以使用其他操作符(如$sum、$avg、$push等)对每个分组进行统计操作。 此外,使用$project操作符可以选择性地展示分组后的字段。例如,如果只想展示分组字段,可以这样操作: db.collection.aggregate([ { $group: { _id: "$fieldname" } }, { $project: { _id: 1 } } ]) 在这个示例中,通过$project操作符将只展示_id字段,其他字段将不会被展示。 总结起来,MongoDB中的分组操作可以通过聚合管道中的$group操作符来实现,并可以使用其他操作符来对分组后的数据进行统计和计算。同时,可以使用$project操作符选择性地展示分组后的字段。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MongoDB 分组统计](https://blog.csdn.net/raqsoft/article/details/87003879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MongoDB分组查询、聚合查询](https://blog.csdn.net/zhuocailing3390/article/details/122706432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值