Учебники

DocumentDB — Запрос документа

В DocumentDB мы фактически используем SQL для запроса документов, так что эта глава посвящена запросам с использованием специального синтаксиса SQL в DocumentDB. Хотя, если вы занимаетесь разработкой .NET, есть также поставщик LINQ, который можно использовать и который может генерировать соответствующий SQL из запроса LINQ.

Запрос документа с помощью портала

На портале Azure есть Query Explorer, который позволяет вам выполнять любые SQL-запросы к базе данных DocumentDB.

Мы будем использовать Query Explorer, чтобы продемонстрировать множество различных возможностей и возможностей языка запросов, начиная с самого простого запроса.

Шаг 1 — В блейде базы данных щелкните, чтобы открыть блейд Query Explorer.

Query Explorer Blade

Помните, что запросы выполняются в рамках коллекции, поэтому 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); 
   } 
	
}

Когда приведенный выше код будет выполнен, вы получите следующий вывод.