В DocumentDB мы фактически используем SQL для запроса документов, так что эта глава посвящена запросам с использованием специального синтаксиса SQL в DocumentDB. Хотя, если вы занимаетесь разработкой .NET, есть также поставщик LINQ, который можно использовать и который может генерировать соответствующий SQL из запроса LINQ.
Запрос документа с помощью портала
На портале Azure есть Query Explorer, который позволяет вам выполнять любые SQL-запросы к базе данных DocumentDB.
Мы будем использовать Query Explorer, чтобы продемонстрировать множество различных возможностей и возможностей языка запросов, начиная с самого простого запроса.
Шаг 1 — В блейде базы данных щелкните, чтобы открыть блейд Query Explorer.
Помните, что запросы выполняются в рамках коллекции, поэтому Query Explorer позволяет выбрать коллекцию в этом раскрывающемся списке.
Шаг 2 — Выберите коллекцию Families, которая была создана ранее с использованием портала.
Query Explorer открывается с этим простым запросом SELECT * FROM c, который просто извлекает все документы из коллекции.
Шаг 3 — Выполните этот запрос, нажав кнопку «Выполнить запрос». Затем вы увидите, что весь документ получен в колонке результатов.
Запрос документа с использованием .Net SDK
Ниже приведены шаги для запуска некоторых запросов документов с использованием .Net SDK.
В этом примере мы хотим запросить только что добавленные документы.
Шаг 1. Вызовите CreateDocumentQuery, передав коллекцию для выполнения запроса по ее SelfLink и тексту запроса.
private async static Task QueryDocumentsWithPaging(DocumentClient client) { Console.WriteLine(); Console.WriteLine("**** Query Documents (paged results) ****"); Console.WriteLine(); Console.WriteLine("Quering for all documents"); var sql = "SELECT * FROM c"; var query = client.CreateDocumentQuery(collection.SelfLink, sql).AsDocumentQuery(); while (query.HasMoreResults) { var documents = await query.ExecuteNextAsync(); foreach (var document in documents) { Console.WriteLine(" Id: {0}; Name: {1};", document.id, document.name); } } Console.WriteLine(); }
Этот запрос также возвращает все документы во всей коллекции, но мы не вызываем .ToList для CreateDocumentQuery, как раньше, который бы выдавал столько запросов, сколько необходимо для вывода всех результатов в одну строку кода.
Шаг 2 — Вместо этого вызовите AsDocumentQuery, и этот метод возвращает объект запроса со свойством HasMoreResults.
Шаг 3. Если значение HasMoreResults равно true, вызовите ExecuteNextAsync, чтобы получить следующий фрагмент, а затем выведите все содержимое этого фрагмента.
Шаг 4 — Вы также можете запросить, используя LINQ вместо SQL, если хотите. Здесь мы определили запрос LINQ в q, но он не будет выполняться, пока мы не запустим .ToList для него.
private static void QueryDocumentsWithLinq(DocumentClient client) { Console.WriteLine(); Console.WriteLine("**** Query Documents (LINQ) ****"); Console.WriteLine(); Console.WriteLine("Quering for US customers (LINQ)"); var q = from d in client.CreateDocumentQuery<Customer>(collection.DocumentsLink) where d.Address.CountryRegionName == " United States" select new { Id = d.Id, Name = d.Name, City = d.Address.Location.City }; var documents = q.ToList(); Console.WriteLine("Found {0} UK customers", documents.Count); foreach (var document in documents) { var d = document as dynamic; Console.WriteLine(" Id: {0}; Name: {1}; City: {2}", d.Id, d.Name, d.City); } Console.WriteLine(); }
SDK преобразует наш запрос LINQ в синтаксис SQL для DocumentDB, генерируя предложение SELECT и WHERE на основе нашего синтаксиса LINQ.
Шаг 5 — Теперь вызовите вышеупомянутые запросы из задачи CreateDocumentClient.
private static async Task CreateDocumentClient() { // Create a new instance of the DocumentClient using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) { database = client.CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 'myfirstdb'").AsEnumerable().First(); collection = client.CreateDocumentCollectionQuery(database.CollectionsLink, "SELECT * FROM c WHERE c.id = 'MyCollection'").AsEnumerable().First(); //await CreateDocuments(client); await QueryDocumentsWithPaging(client); QueryDocumentsWithLinq(client); } }
Когда приведенный выше код будет выполнен, вы получите следующий вывод.