Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
 /// <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));
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        //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);
        }
Exemplo n.º 5
0
 public static BsonDocument ToGroupDocument(this IMongoGroupBy fieldsGroupBy)
 {
     return(ToGroupDocument(fieldsGroupBy, null));
 }
Exemplo n.º 6
0
 /// <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));
 }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
        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);
        }