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