public void SaveCounters(TotalAggregationResult counters)
        {
            MongoCollection <BsonDocument> items = Database.GetCollection("countersData");

            BsonDocument cData = new BsonDocument()
            {
                counters.ResultGroups.Select(
                    r =>
                    new BsonElement(CountersMapper.Map(counters.CounterCategory,
                                                       counters.CounterName,
                                                       r.CounterGroup.Source,
                                                       r.CounterGroup.Instance,
                                                       r.CounterGroup.ExtendedData),
                                    new BsonDocument(
                                        r.Result.Select(
                                            v =>
                                            new BsonElement(v.Item1, GetBsonValue(v.Item2))))))
            };

            BsonDocument data = new BsonDocument
            {
                { "date", counters.Date },
                { "counterCategory", counters.CounterCategory },
                { "counterName", counters.CounterName },
                { "type", counters.CounterAggregationType.ToString() },
                { "data", cData }
            };

            items.Insert(data);
        }
        public List <CounterSeriesData> GetCounterData(DateTime beginDate, DateTime endDate, int counterCategoryId,
                                                       int counterNameId, int counterSourceId, int counterInstanceId,
                                                       int counterExtDataId, List <string> seriesFilter)
        {
            List <CounterSeriesData> resultData = new List <CounterSeriesData>();

            if (seriesFilter.Count == 0)
            {
                return(resultData);
            }
            bool          getAllSeries = seriesFilter.Contains("*");
            List <string> seriesNames  = new List <string>();


            MongoCollection <BsonDocument> items = Database.GetCollection("countersData");
            string mappedCategoryName            = CountersMapper.GetMappedCategoryName(counterCategoryId);
            string mappedCounterName             = CountersMapper.GetMappedCounterName(counterCategoryId, counterNameId);
            string mappedCounterInstance         = CountersMapper.GetMappedCounterInstanceName(counterCategoryId, counterNameId,
                                                                                               counterInstanceId);
            string mappedCounterSource = CountersMapper.GetMappedCounterSourceName(counterCategoryId, counterNameId,
                                                                                   counterSourceId);
            string mappedCounterExtData = CountersMapper.GetMappedCounterExtDataName(counterCategoryId, counterNameId,
                                                                                     counterExtDataId);


            QueryComplete qb = beginDate == endDate
                                   ? Query.EQ("date", beginDate)
                                   : Query.GT("date", beginDate).LTE(endDate);

            QueryComplete qb2       = Query.EQ("counterCategory", mappedCategoryName);
            QueryComplete qb3       = Query.EQ("counterName", mappedCounterName);
            SortByBuilder sortOrder = new SortByBuilder().Ascending("date");
            var           cursor    = items.Find(Query.And(qb, qb2, qb3));

            cursor.SetSortOrder(sortOrder);
            string counterDescription = counterSourceId + "/" + counterInstanceId + "/" + counterExtDataId;

            cursor.SetFields(Fields.Include("type", "date", "data." + counterDescription));

            foreach (BsonDocument cnt in cursor)
            {
                var dateTime     = cnt["date"].AsDateTime;
                var countersData = cnt["data"].AsBsonDocument;
                if (!countersData.Contains(counterDescription))
                {
                    foreach (string seriesName in seriesNames)
                    {
                        if (getAllSeries || seriesFilter.Contains(seriesName))
                        {
                            resultData.Find(f => f.SeriesName == seriesName).AddSeriesPoint(new SeriesPoint(dateTime, null));
                        }
                    }
                    continue;
                }
                var seriesPoints = countersData[counterDescription].AsBsonDocument;

                foreach (BsonElement seriesPoint in seriesPoints)
                {
                    string seriesName = seriesPoint.Name;
                    if (!seriesNames.Contains(seriesName))
                    {
                        seriesNames.Add(seriesName);
                    }
                    if (!getAllSeries && !seriesFilter.Contains(seriesName))
                    {
                        continue;
                    }
                    var value = seriesPoint.Value.IsString
                                    ? new UniversalValue(
                        TimeSpan.Parse(seriesPoint.Value.AsString))
                                    : new UniversalValue(
                        seriesPoint.Value.ToDouble());

                    var a = resultData.Find(f => f.SeriesName == seriesName);
                    if (a == null)
                    {
                        a = new CounterSeriesData(seriesName, value.Type, mappedCategoryName, mappedCounterName,
                                                  mappedCounterSource, mappedCounterInstance, mappedCounterExtData);
                        resultData.Add(a);
                    }
                    a.AddSeriesPoint(new SeriesPoint(dateTime, value));
                }
            }
            return(resultData);
        }