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.
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.
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.
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.
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
🚫