示例#1
0
        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));
        }
示例#2
0
        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);
        }