private static FilterDefinition <MongoDbSubscription> CreatePrefixFilter(string appId, string?userId, TopicId topic, bool withUser) { var filters = new List <FilterDefinition <MongoDbSubscription> >(); if (withUser) { filters.Add(Filter.Eq(x => x.UserId, userId)); } else { filters.Add(Filter.Ne(x => x.UserId, userId)); } filters.Add(Filter.Eq(x => x.AppId, appId)); var index = 0; foreach (var part in topic.GetParts()) { var fieldName = $"ta.{index}"; filters.Add( Filter.Or( Filter.Eq(fieldName, part), Filter.Exists(fieldName, false))); index++; } return(Filter.And(filters)); }
public async Task Should_be_fast() { var empty = Guid.Empty.ToString(); var count = await _.Repository.Collection.CountDocumentsAsync(new BsonDocument()); var random = new Random(); const int Count = 1_000_000; if (count < Count) { var inserts = new List <MongoDbSubscription>(); for (var i = 0; i < Count; i++) { TopicId randomTopic = $"{Guid.NewGuid()}/{random.Next(10000)}/{random.Next(10000)}/{random.Next(10000)}/{random.Next(10000)}/{random.Next(10000)}a"; inserts.Add(new MongoDbSubscription { DocId = Guid.NewGuid().ToString(), AppId = empty, TopicArray = randomTopic.GetParts(), TopicPrefix = randomTopic, UserId = empty }); } await _.Repository.Collection.InsertManyAsync(inserts); } var topicToSearch = $"{Guid.NewGuid()}/{random.Next(10000)}/{random.Next(10000)}a"; await ToList(_.Repository.QueryAsync(empty, topicToSearch)); await ToList(_.Repository.QueryAsync(empty, topicToSearch)); var watch = Stopwatch.StartNew(); await ToList(_.Repository.QueryAsync(empty, topicToSearch)); watch.Stop(); Assert.InRange(watch.ElapsedMilliseconds, 0, 20); }