MongoDB 的分组操作 In C#

C#对mongodb的分组查询操作,主要通过脚本或Aggregate方法来实现,以下通过一些实例作解析:

参考资料:http://www.tuicool.com/articles/2iqUZj

       http://www.cnblogs.com/vnii/archive/2012/08/23/2652891.html

       http://www.cnblogs.com/zhwl/archive/2013/12/19/3482140.html

1. 根据任务id进行分组,统计每个任务的浏览数量。

  

        public static List<vm_quantityModel> GetMyIncomeDetail(int member_id, int pageIndex, int pageSize, out int totalCount)
        {
            //筛选条件
            IMongoQuery query = Query.And(Query.EQ("member_id", member_id), Query.EQ("mark", 1));

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

            //分组
            Dictionary<string, int> dic_initial = new Dictionary<string, int>();
            dic_initial["num"] = 0;
            var r = myCollection.Group(
                query,
                "task_id", //分组的字段
                BsonDocument.Create(dic_initial),
                BsonJavaScript.Create("function(doc,prev){prev.num++;}"),
                null
            ).ToList();

            List<vm_quantityModel> result = new List<vm_quantityModel>();
            if (r != null && r.Count > 0)
            {
                foreach (var item in r)
                {
                    vm_quantityModel m = new vm_quantityModel();
                    m.task_id = Common.StringHelper.StrToInt(item["task_id"].ToString());
                    m.valid_count = Common.StringHelper.StrToLong(item["num"].ToString());
                    result.Add(m);
                }
            }

            totalCount = result.Count;
            result = result.OrderByDescending(x => x.task_id).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();

            return result;
        }

2.根据会员编号分组,累加价格的统计

        /// <summary>
        /// 帮帮赚会员总收益
        /// </summary>
        /// <param name="memberIds"></param>
        /// <returns></returns>
        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;
        }

用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>();

            //foreach (var example in matchingExamples)
            //{
            //    var message = string.Format("{0} - {1}", example._id.MyUser, example.Count);
            //    Console.WriteLine(message);
            //}

            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;
        }

3. 按日期分组,累加价格的统计

        public static List<vm_bangzhuan_detailModel> GetBangZhuanDetails(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");          

            Dictionary<string, double> dic_M = new Dictionary<string, double>();
            dic_M["msum"] = 0.0;
            var result_M = myCollection.Group(query, BsonJavaScript.Create("function(doc){  var date = new Date(doc.add_time); var dateKey = date.getFullYear()+‘年‘+(date.getMonth()+1)+‘月‘+date.getDate();  return {‘day‘:dateKey}; }"), 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_bangzhuan_detailModel> result = new List<vm_bangzhuan_detailModel>();
            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_bangzhuan_detailModel
                    {
                        day = Convert.ToDateTime(item["day"]),
                        amount = amount
                    });
                }
            }

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

            return result;
        }
时间: 2024-10-07 02:41:10

MongoDB 的分组操作 In C#的相关文章

mongoDB进行分组操作

一.$group 进行分组 1.每个职位的雇员人数: db.getCollection('emp').aggregate( [ {'$group':{ '_id':'$job', job_count:{'$sum':1} } } ] ) 2.每个职位的总工资 db.getCollection('emp').aggregate( [ {'$group':{ '_id':'$job', job_salaryt:{'$sum':'$salary'} } } ] ) 3.每个职位的平均工资 db.get

MongoDB 的聚集操作

聚合引言 聚集操作就是出来数据记录并返回计算结果的操作.MongoDB提供了丰富的聚集操作,能够检测和执行数据集上的计算.运行在mongod上的数据聚集简化了代码和资源限制. 像查询一样,在Mongo的聚合操作使用collections作为输入,并返回一个或多个document作为输出. 聚合模式 聚合管道 MongoDB2.2引入了一个新的聚合框架:聚合管道,这是基于数据处理管道概念的模型.文档输入一个多阶段的管道并将文档转化为一个聚合的结果. 最基本的管道阶段提供了过滤器(Filters)来

mongodb group分组(最详细、最通俗、最易理解的讲解)

和数据库一样group常常用于统计.MongoDB的group还有很多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键,好像还不能利用索引[不很确定]. Group大约需要一下几个参数. 1.key:用来分组文档的字段.和keyf两者必须有一个 2.keyf:可以接受一个javascript函数.用来动态的确定分组文档的字段.和key两者必须有一个 3.initial:reduce中使用变量的初始化 4.reduce:执行的reduce函数.函数需要返回值. 5

Ruby操作MongoDB(进阶)-CRUD操作

MongDB数据库的使用离不开CRUD操作.什么是CRUD,就是创建文档,读取文档信息,更新文档和删除文档. key-value键值对标记 在MongoDB的Ruby驱动中,Key_value键值多次出现.而且有时会出现语法上的巧合,这取决于在使用的Ruby版本中如何申明. 在文档创建步骤中,1.9及之后版本支持以下语法: document={name:"Tom",age:20}. 但是如果你使用的是2.2或者更高的版本,你可以用双引号将你的key包起来.如: document={&q

【翻译】MongoDB指南/CRUD操作(二)

[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关注),写确认(写关注) 1 更新文档 1.1 更新 MongoDB提供下列方法用于更新一个集合 db.collection.updateOne() 更新使用指定过滤器匹配到的文档,即使过滤器匹配到多个文档,也只会更新一个文档. 3.2版本新增特性. db.collection.updateMany(

【翻译】MongoDB指南/CRUD操作(一)

[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删除文档. 创建操作 执行创建或者插入操作可向集合中添加文档.如果集合不存在,插入操作会创建此集合. MongoDB提供下列方法向集合中插入文档: db.collection.insert() db.collection.insertOne()  3.2版本新增 db.collection.inser

Python mongoDB 的简单操作

#!/usr/bin/env python # coding:utf-8 # Filename:mongodb.py from pymongo import MongoClient,ASCENDING,DESCENDING import datetime # connection with mongoclient client=MongoClient() # getting a database db=client.test # getting a collection collection=d

MongoDB Shell 常用操作

数组查询 数组查询 MongoDB 中有子文档的概念,一个文档中能方便的嵌入子文档,这与关系性数据库有着明显的不同,在查询时,语法有一些注意点. 例子代码,假如我们的一个集合(tests)中存在标签键,有如下模式: tags: [ObjectId] 查询含有某个标签 ID 的文档 db.tests.find({tags: tagId}); 我现在有一组标签 tagIds,即是数组,需要查询含有该数组中任一元素的文档,此时需要用到 $in 操作符 db.tests.find({tags: {$in

MongoDB的CRUD操作

1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的增删改查操作,不同于我们熟悉的关系数据库中的操作.在关系数据库中,比如MySQL,我们通常使用SQL语句对数据库进行增(INSERT)删(DELETE)改(UPDATE)查(SELECT).MongoDB在对数据进行操作过程中,使用的是Document进行数据操作.在对数据库进行操作的时候,使用Do