Banco de Dados de Documentos - Consultar Documento

No DocumentDB, na verdade usamos SQL para consultar documentos, portanto, este capítulo trata de consultas usando a sintaxe SQL especial no DocumentDB. Embora se você estiver fazendo desenvolvimento em .NET, também há um provedor LINQ que pode ser usado e que pode gerar SQL apropriado a partir de uma consulta LINQ.

Consultando documento usando o Portal

O portal do Azure tem um Explorador de Consultas que permite executar qualquer consulta SQL em seu banco de dados DocumentDB.

Usaremos o Query Explorer para demonstrar os muitos recursos e recursos diferentes da linguagem de consulta, começando com a consulta mais simples possível.

Step 1 - Na folha do banco de dados, clique para abrir a folha Explorador de Consultas.

Lembre-se de que as consultas são executadas no escopo de uma coleção e, portanto, o Query Explorer permite que você escolha a coleção nesta lista suspensa.

Step 2 - Selecione a coleção de Famílias que é criada anteriormente usando o portal.

O Query Explorer é aberto com esta consulta simples SELECT * FROM c, que simplesmente recupera todos os documentos da coleção.

Step 3- Execute esta consulta clicando no botão 'Executar consulta'. Em seguida, você verá que o documento completo é recuperado na folha Resultados.

Consultando documento usando .Net SDK

A seguir estão as etapas para executar algumas consultas de documentos usando .Net SDK.

Neste exemplo, queremos consultar os documentos recém-criados que acabamos de adicionar.

Step 1 - Chame CreateDocumentQuery, passando a coleção para executar a consulta por seu SelfLink e o texto da consulta.

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(); 
}

Essa consulta também está retornando todos os documentos em toda a coleção, mas não estamos chamando .ToList em CreateDocumentQuery como antes, o que emitiria quantas solicitações fossem necessárias para obter todos os resultados em uma linha de código.

Step 2 - Em vez disso, chame AsDocumentQuery e este método retorna um objeto de consulta com uma propriedade HasMoreResults.

Step 3 - Se HasMoreResults for verdadeiro, chame ExecuteNextAsync para obter o próximo bloco e, em seguida, despeje todo o conteúdo desse bloco.

Step 4- Você também pode consultar usando LINQ em vez de SQL, se preferir. Aqui, definimos uma consulta LINQ em q, mas ela não será executada até executarmos .ToList nela.

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(); 
}

O SDK converterá nossa consulta LINQ em sintaxe SQL para DocumentDB, gerando uma cláusula SELECT e WHERE com base em nossa sintaxe LINQ

Step 5 - Agora chame as consultas acima da tarefa 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); 
   } 
	
}

Quando o código acima for executado, você receberá a seguinte saída.

**** Query Documents (paged results) ****  
Quering for all documents 
 Id: 7e9ad4fa-c432-4d1a-b120-58fd7113609f; Name: New Customer 1; 
 Id: 34e9873a-94c8-4720-9146-d63fb7840fad; Name: New Customer 1;  
 
**** Query Documents (LINQ) **** 
Quering for US customers (LINQ) 
Found 2 UK customers 
 Id: 7e9ad4fa-c432-4d1a-b120-58fd7113609f; Name: New Customer 1; City: Brooklyn 
 Id: 34e9873a-94c8-4720-9146-d63fb7840fad; Name: New Customer 1; City: Brooklyn