private async Task <bool> CreateUpdateItem(string region, object item)
        {
            var mongoCollection = MongoUtilities.InitializeMongoDatabase(region, _mongoConnectionString);

            Task.Factory.StartNew(() => RemoveExpired(region));
            var results = await Task.Factory.StartNew(() => mongoCollection.Save(item));

            return(await MongoUtilities.VerifyReturnMessage(results));
        }
        /// <summary>
        /// get the count of items in a cache region
        /// </summary>
        /// <param name="region"></param>
        /// <returns></returns>
        public override async Task <long> Count(string region)
        {
            if (!_isEnabled)
            {
                return(0);
            }
            var mongoCollection = MongoUtilities.InitializeMongoDatabase(region, _mongoConnectionString);

            return(await Task.Factory.StartNew(() => mongoCollection.Count()));
        }
        /// <summary>
        /// removes an item from cache region
        /// </summary>
        /// <param name="cacheKey"></param>
        /// <param name="region"></param>
        /// <returns></returns>
        public override async Task <bool> Remove(object cacheKey, string region)
        {
            if (!_isEnabled)
            {
                return(true);
            }

            var mongoCollection = MongoUtilities.InitializeMongoDatabase(region, _mongoConnectionString);

            var query   = Query.EQ("CacheKey", cacheKey.ToString());
            var results = await Task.Factory.StartNew(() => mongoCollection.Remove(query));

            return(await MongoUtilities.VerifyReturnMessage(results));
        }
        private async Task <dynamic> GetItem(object cacheKey, string region)
        {
            var item = await Task.Factory.StartNew(() => MongoUtilities.InitializeMongoDatabase(region, _mongoConnectionString).AsQueryable <dynamic>()
                                                   .AsParallel()
                                                   .FirstOrDefault(x => x.CacheKey.Equals(cacheKey.ToString(), StringComparison.CurrentCultureIgnoreCase) && x.Expires > DateTime.UtcNow));

            if (item == null)
            {
                return(null);
            }

            // todo can be removed after dec
            if (GlobalUtilities.DoesPropertyExist(item, "AllowSliddingTime") || GlobalUtilities.DoesPropertyExist(item.CacheOptions.AllowSliddingTime, "AllowSliddingTime"))
            {
                await UpdateSliddingTime(region, item);
            }

            return(item);
        }
        /// <summary>
        /// remove expired items by region
        /// </summary>
        /// <param name="region"></param>
        /// <returns></returns>
        public async override Task <bool> RemoveExpired(string region)
        {
            if (!_isEnabled)
            {
                return(true);
            }

            var mongoCollection = MongoUtilities.InitializeMongoDatabase(region, _mongoConnectionString);

            var item = await Task.Factory.StartNew(() => mongoCollection.AsQueryable <CacheItem>().AsParallel().Where(x => x.Expires < DateTime.UtcNow).Select(x => x.Id));

            var query2 = Query.In("_id", new BsonArray(item));

            mongoCollection.Remove(query2);

            if (item.Any())
            {
                // todo add logging
            }

            return(true);
        }