public MongoStringPatternProcessorRepository(IOptimizerConfig optimizerConfig, IStringPatternProcessorFactory stringPatternProcessorFactory)
        {
            this.stringPatternProcessorFactory = stringPatternProcessorFactory;
            var client = new MongoClient(optimizerConfig.MongoConnectionString);
            var server = client.GetServer();
            var db = server.GetDatabase(string.Format("{0}-{1}", optimizerConfig.MongoDatabasePrefix, optimizerConfig.InstanceId));

            var collectionName = typeof(StringPatternProcessorResult).Name;

            if (!db.CollectionExists(collectionName))
            {
                var collectionOptions = CollectionOptions.SetCapped(true).SetMaxSize(524288000);
                db.CreateCollection(collectionName, collectionOptions);
            }

            this.stringPatternProcessorCollection = db.GetCollection<StringPatternProcessorResult>(collectionName);
            
            var keys = IndexKeys<StringPatternProcessorResult>.Ascending(x => x.GenerationNumber, x => x.PopulationRank);
            var options = IndexOptions.SetName("GenerationNumber And PopulationRank").SetUnique(true).SetBackground(true);
            this.stringPatternProcessorCollection.CreateIndex(keys, options);
        }
        public MongoStringPatternProcessorRepository(IOptimizerConfig optimizerConfig, IStringPatternProcessorFactory stringPatternProcessorFactory)
        {
            this.stringPatternProcessorFactory = stringPatternProcessorFactory;
            var client = new MongoClient(optimizerConfig.MongoConnectionString);
            var server = client.GetServer();
            var db     = server.GetDatabase(string.Format("{0}-{1}", optimizerConfig.MongoDatabasePrefix, optimizerConfig.InstanceId));

            var collectionName = typeof(StringPatternProcessorResult).Name;

            if (!db.CollectionExists(collectionName))
            {
                var collectionOptions = CollectionOptions.SetCapped(true).SetMaxSize(524288000);
                db.CreateCollection(collectionName, collectionOptions);
            }

            this.stringPatternProcessorCollection = db.GetCollection <StringPatternProcessorResult>(collectionName);

            var keys = IndexKeys <StringPatternProcessorResult> .Ascending(x => x.GenerationNumber, x => x.PopulationRank);

            var options = IndexOptions.SetName("GenerationNumber And PopulationRank").SetUnique(true).SetBackground(true);

            this.stringPatternProcessorCollection.CreateIndex(keys, options);
        }