public static BsonDocument ToGroupDocument(this IMongoGroupBy fieldsGroupBy, string collectionName) { var _groupBy = new BsonDocument(); if (!string.IsNullOrWhiteSpace(collectionName)) { _groupBy.Add(collectionName, string.Format("${0}", collectionName)); } else { foreach (string _name in fieldsGroupBy.ToBsonDocument().Names) { _groupBy.Add(new BsonElement(_name, string.Format("${0}", _name))); } } var _sums = new BsonDocument("_id", _groupBy); foreach (string _name in fieldsGroupBy.ToBsonDocument().Names) { _sums.Add(_name, new BsonDocument("$sum", string.Format("${0}", _name))); } return(new BsonDocument("$group", _sums)); }
/// <summary> /// Runs the group command on this collection. /// </summary> /// <param name="query">The query (usually a QueryDocument or constructed using the Query builder).</param> /// <param name="keys">The names of the fields to group on.</param> /// <param name="initial">Initial value passed to the reduce function for each group.</param> /// <param name="reduce">A JavaScript function that is called for each matching document in a group.</param> /// <param name="finalize">A JavaScript function that is called at the end of the group command.</param> /// <returns>A list of results as BsonDocuments.</returns> public virtual IEnumerable <BsonDocument> Group( IMongoQuery query, IMongoGroupBy keys, BsonDocument initial, BsonJavaScript reduce, BsonJavaScript finalize) { return(_collection.Group(query, keys, initial, reduce, finalize)); }
public override IEnumerable <BsonDocument> Group(IMongoQuery query, IMongoGroupBy keys, BsonDocument initial, BsonJavaScript reduce, BsonJavaScript finalize) { var sw = new Stopwatch(); sw.Start(); var result = base.Group(query, keys, initial, reduce, finalize); sw.Stop(); var commandStringBuilder = new StringBuilder(1024); commandStringBuilder.AppendFormat("db.{0}.group({{key, reduce, initial", Name); if (query != null) { commandStringBuilder.Append(", cond"); } if (initial != null) { commandStringBuilder.Append(", initial"); } if (finalize != null) { commandStringBuilder.Append(", finalize"); } commandStringBuilder.Append("})"); commandStringBuilder.AppendFormat("\nkey = {0}", keys.ToBsonDocument()); commandStringBuilder.Append("\nreduce = javascript"); commandStringBuilder.AppendFormat("\ninitial = {0}", initial.ToBsonDocument()); if (query != null) { commandStringBuilder.AppendFormat("\ncond = {0}", query.ToBsonDocument()); } if (initial != null) { commandStringBuilder.AppendFormat("\ninitial = {0}", initial.ToBsonDocument()); } if (finalize != null) { commandStringBuilder.Append("\nfinalize = javascript"); } string commandString = commandStringBuilder.ToString(); ProfilerUtils.AddMongoTiming(commandString, sw.ElapsedMilliseconds, ExecuteType.Read); return(result); }
//http://docs.mongodb.org/manual/core/aggregation-pipeline-optimization/#aggregation-pipeline-sequence-optimization public double Sum <T>(IMongoQuery query, IMongoGroupBy fieldsGroupBy) { var _match = query.ToMatchDocument(); var _group = fieldsGroupBy.ToGroupDocument(MongoExtensions.GetCollectionName <T>()); var _result = Aggregate <T>(_match, _group).SingleOrDefault(); return(_result != null?Convert.ToDouble(_result.GetValue(1)) : 0); }
public static BsonDocument ToGroupDocument(this IMongoGroupBy fieldsGroupBy) { return(ToGroupDocument(fieldsGroupBy, null)); }
/// <summary> /// Group By를 수행합니다. (Find() 후에 LINQ 의 GroupBy를 사용하는게 더 편할 것 같습니다) /// </summary> /// <param name="query">필터링</param> /// <param name="groupBy">Grouping 기준 키 (예: GroupBy.Keys("x"), GroupBy.Function("function(doc) { return { x: doc.x }; }") )</param> /// <param name="initial">초기값에 해당하는 Document</param> /// <param name="reduce">Grouping 시의 처리에 대한 로직을 가진 Javascript (예: "function(doc, prev) { prev.count += 1; }")</param> /// <param name="finalize">마지막 정리 시의 실행해야 할 Javascript</param> /// <returns>Grouping된 Document의 컬렉션</returns> public IEnumerable <BsonDocument> Group(IMongoQuery query, IMongoGroupBy groupBy, BsonDocument initial, BsonJavaScript reduce, BsonJavaScript finalize) { return(Collection.Group(query, groupBy, initial, reduce, finalize)); }
public IEnumerable <BsonDocument> Group(IMongoQuery query, IMongoGroupBy keys, BsonDocument initial, BsonJavaScript reduce, BsonJavaScript finalize) { IMongoQuery fixedQuery = MongoUtil.FormatIdElementForMongoQuery(query); return(Collection.Group(fixedQuery, keys, initial, reduce, finalize)); }
public static Task <IEnumerable <BsonDocument> > GroupAsync(this MongoCollection collection, IMongoQuery query, IMongoGroupBy keys, BsonDocument initial, BsonJavaScript reduce, BsonJavaScript finalize) { var tcs = new TaskCompletionSource <IEnumerable <BsonDocument> >(); ThreadPool.QueueUserWorkItem(_ => { try { var result = collection.Group(query, keys, initial, reduce, finalize); tcs.SetResult(result); } catch (Exception exc) { tcs.SetException(exc); } }); return(tcs.Task); }