DocumentDB - Interroga documento

In DocumentDB, usiamo effettivamente SQL per eseguire query per i documenti, quindi questo capitolo è interamente dedicato alle query utilizzando la speciale sintassi SQL in DocumentDB. Anche se si esegue lo sviluppo .NET, è disponibile anche un provider LINQ che può essere utilizzato e che può generare SQL appropriato da una query LINQ.

Interrogazione del documento utilizzando il portale

Il portale di Azure ha un Query Explorer che consente di eseguire qualsiasi query SQL sul database DocumentDB.

Useremo Query Explorer per dimostrare le molte diverse capacità e caratteristiche del linguaggio di query a partire dalla query più semplice possibile.

Step 1 - Nel pannello del database, fare clic per aprire il pannello Esplora query.

Ricorda che le query vengono eseguite nell'ambito di una raccolta, quindi Query Explorer ti consente di scegliere la raccolta in questo menu a discesa.

Step 2 - Selezionare la raccolta Famiglie creata in precedenza utilizzando il portale.

Query Explorer si apre con questa semplice query SELECT * FROM c, che recupera semplicemente tutti i documenti dalla raccolta.

Step 3- Esegui questa query facendo clic sul pulsante "Esegui query". Quindi vedrai che il documento completo viene recuperato nel pannello Risultati.

Interrogazione del documento utilizzando .Net SDK

Di seguito sono riportati i passaggi per eseguire alcune query sui documenti utilizzando .Net SDK.

In questo esempio, vogliamo eseguire una query per i documenti appena creati che abbiamo appena aggiunto.

Step 1 - Chiama CreateDocumentQuery, passando la raccolta su cui eseguire la query tramite il suo SelfLink e il testo della query.

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

Questa query restituisce anche tutti i documenti dell'intera raccolta, ma non stiamo chiamando .ToList su CreateDocumentQuery come prima, che emetterebbe tutte le richieste necessarie per estrarre tutti i risultati in una riga di codice.

Step 2 - Invece, chiama AsDocumentQuery e questo metodo restituisce un oggetto query con una proprietà HasMoreResults.

Step 3 - Se HasMoreResults è true, chiamare ExecuteNextAsync per ottenere il blocco successivo e quindi eseguire il dump di tutti i contenuti di quel blocco.

Step 4- Puoi anche eseguire query utilizzando LINQ anziché SQL, se preferisci. Qui abbiamo definito una query LINQ in q, ma non verrà eseguita finché non eseguiremo .ToList su di essa.

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

L'SDK convertirà la nostra query LINQ nella sintassi SQL per DocumentDB, generando una clausola SELECT e WHERE basata sulla nostra sintassi LINQ

Step 5 - Ora chiama le query precedenti dall'attività 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 il codice precedente viene eseguito, riceverai il seguente output.

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