DocumentDB - Documento de consulta

En DocumentDB, en realidad usamos SQL para consultar documentos, por lo que este capítulo trata sobre las consultas utilizando la sintaxis SQL especial en DocumentDB. Aunque si está desarrollando .NET, también hay un proveedor LINQ que se puede utilizar y que puede generar SQL apropiado a partir de una consulta LINQ.

Consultando documento usando Portal

Azure Portal tiene un Explorador de consultas que le permite ejecutar cualquier consulta SQL en su base de datos de DocumentDB.

Usaremos el Explorador de consultas para demostrar las diferentes capacidades y características del lenguaje de consulta, comenzando con la consulta más simple posible.

Step 1 - En la hoja de la base de datos, haga clic para abrir la hoja Explorador de consultas.

Recuerde que las consultas se ejecutan dentro del alcance de una colección, por lo que el Explorador de consultas le permite elegir la colección en este menú desplegable.

Step 2 - Seleccione la colección Familias que se creó anteriormente utilizando el portal.

El Explorador de consultas se abre con esta consulta simple SELECT * FROM c, que simplemente recupera todos los documentos de la colección.

Step 3- Ejecute esta consulta haciendo clic en el botón 'Ejecutar consulta'. Luego verá que el documento completo se recupera en la hoja Resultados.

Consultar documento con .Net SDK

Los siguientes son los pasos para ejecutar algunas consultas de documentos usando .Net SDK.

En este ejemplo, queremos consultar los documentos recién creados que acabamos de agregar.

Step 1 - Llame a CreateDocumentQuery, pasando la colección para ejecutar la consulta por su SelfLink y el texto de la 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(); 
}

Esta consulta también devuelve todos los documentos de la colección completa, pero no llamamos a .ToList en CreateDocumentQuery como antes, que emitiría tantas solicitudes como sea necesario para desplegar todos los resultados en una línea de código.

Step 2 - En su lugar, llame a AsDocumentQuery y este método devuelve un objeto de consulta con una propiedad HasMoreResults.

Step 3 - Si HasMoreResults es verdadero, entonces llame a ExecuteNextAsync para obtener el siguiente fragmento y luego volcar todo el contenido de ese fragmento.

Step 4- También puede consultar utilizando LINQ en lugar de SQL si lo prefiere. Aquí hemos definido una consulta LINQ en q, pero no se ejecutará hasta que ejecutemos .ToList en ella.

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

El SDK convertirá nuestra consulta LINQ en sintaxis SQL para DocumentDB, generando una cláusula SELECT y WHERE basada en nuestra sintaxis LINQ

Step 5 - Ahora llame a las consultas anteriores desde la tarea 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); 
   } 
	
}

Cuando se ejecuta el código anterior, recibirá el siguiente resultado.

**** 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