DocumentDB – Solicitar documento

En DocumentDB, en realidad usamos SQL para consultar documentos, por lo que este capítulo se enfoca en realizar consultas usando la sintaxis SQL personalizada en DocumentDB. Aunque, si está en el desarrollo de.NET, también hay un proveedor LINQ que puede usar y que puede generar el SQL apropiado a partir de una consulta LINQ.

Solicitar un documento mediante el portal

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

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

Paso 1 – En la columna de la base de datos, haga clic para abrir la columna Explorador de consultas.

Hoja del explorador de consultas

Recuerde que las consultas se ejecutan dentro de una colección y, por lo tanto, el Explorador de consultas le permite seleccionar una colección de este menú desplegable.

Ejecuta una solicitud

Paso 2 – Seleccione la colección de Familias, creada anteriormente usando el portal.

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

Paso 3 – Ejecute esta solicitud haciendo clic en el botón Ejecutar solicitud. Después de eso, verá que el documento completo se recuperará en la columna Resultados.

Documento en hoja de resultados

Solicitar un documento utilizando.Net SDK

A continuación se muestran los pasos para ejecutar algunas consultas de documentos utilizando.Net SDK.

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

Paso 1 – Llame a CreateDocumentQuery pasando la colección para ejecutar la consulta por su SelfLink y el cuerpo 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 lo hicimos antes, que emitirá tantas consultas como sea necesario para obtener todos los resultados en una línea de código.

Paso 2 – Llame a AsDocumentQuery en su lugar, y este método devolverá un objeto de consulta con la propiedad HasMoreResults.

Paso 3 – Si HasMoreResults es verdadero, llame a ExecuteNextAsync para obtener el siguiente fragmento y luego descarte todo el contenido de ese fragmento.

Paso 4 – También puede ejecutar consultas utilizando LINQ en lugar de SQL si lo desea. Aquí hemos definido una consulta LINQ en q, pero no se ejecutará hasta que ejecutemos.ToList para 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 convierte nuestra consulta LINQ a sintaxis SQL para DocumentDB, generando cláusulas SELECT y WHERE basadas en nuestra sintaxis LINQ.

Paso 5 – Ahora llame a las solicitudes 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

🚫