using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Core.Events; namespace MongoTest { class Program { static void Main(string[] args) { var connectionString = new MongoClientSettings() { Server = new MongoServerAddress("localhost"), ClusterConfigurator = builder => builder .Subscribe(e => Console.WriteLine($"{e.CommandName} - {e.Command.ToJson()}")) .Subscribe(e => Console.WriteLine($"{e.CommandName} - {e.Duration.TotalMilliseconds} ms")) }; var client = new MongoClient(connectionString); var db = client.GetDatabase("test"); var collection = db.GetCollection("cities"); if (collection.CountDocuments(FilterDefinition.Empty) == 0) { PopulateCollection(collection); } for (int i = 0; i < 5; i++) { var list = collection.AsQueryable() .Where(city => city.Shops.Any(shop => shop.Name == "Shop 1" && shop.Books.Any(book => book.Pages.Any(page => page.Text == "page_1_1")))) .ToList(); Console.WriteLine(list.ToJson()); } } private static void PopulateCollection(IMongoCollection collection) { var cities = Enumerable.Range(0, 150).Select(c => new City() { Name = $"City {c}", ZipCodes = Enumerable.Range(0, 10).Select(z => $"{c}-{z}").ToList(), Shops = Enumerable.Range(0, 10).Select(s => new Shop() { Name = $"Shop {s}", Books = Enumerable.Range(0, 10).Select(b => new Book() { Pages = Enumerable.Range(0, 3).Select(p => new Page() { Number = p, Text = $"page_{b}_{p}" }).ToArray(), Title = $"title_{b}" }).ToList() }).ToList() }).ToList(); collection.InsertMany(cities); Console.WriteLine($"{cities.Count} cities inserted."); } } class Page { public int Number { get; set; } public string Text { get; set; } } class Book { public string Title { get; set; } public IReadOnlyList Pages { get; set; } } class Shop { public string Name { get; set; } public IReadOnlyList Books { get; set; } } class City { public ObjectId Id { get; set; } public string Name { get; set; } public List ZipCodes { get; set; } public IReadOnlyList Shops { get; set; } } }