DocumentDB - Document de requête

Dans DocumentDB, nous utilisons en fait SQL pour interroger des documents, donc ce chapitre est consacré à l'interrogation à l'aide de la syntaxe SQL spéciale de DocumentDB. Bien que si vous faites du développement .NET, il existe également un fournisseur LINQ qui peut être utilisé et qui peut générer le SQL approprié à partir d'une requête LINQ.

Interroger un document à l'aide du portail

Le portail Azure dispose d'un explorateur de requêtes qui vous permet d'exécuter n'importe quelle requête SQL sur votre base de données DocumentDB.

Nous utiliserons l'explorateur de requêtes pour démontrer les nombreuses capacités et fonctionnalités du langage de requête en commençant par la requête la plus simple possible.

Step 1 - Dans le panneau Base de données, cliquez pour ouvrir le panneau Explorateur de requêtes.

N'oubliez pas que les requêtes s'exécutent dans le cadre d'une collection et que l'explorateur de requêtes vous permet de choisir la collection dans cette liste déroulante.

Step 2 - Sélectionnez la collection Familles créée précédemment à l'aide du portail.

L'Explorateur de requêtes s'ouvre avec cette simple requête SELECT * FROM c, qui récupère simplement tous les documents de la collection.

Step 3- Exécutez cette requête en cliquant sur le bouton «Exécuter la requête». Ensuite, vous verrez que le document complet est récupéré dans le panneau Résultats.

Interroger un document à l'aide du SDK .Net

Voici les étapes pour exécuter certaines requêtes de document à l'aide du SDK .Net.

Dans cet exemple, nous voulons interroger les documents nouvellement créés que nous venons d'ajouter.

Step 1 - Appelez CreateDocumentQuery, en passant la collection sur laquelle exécuter la requête par son SelfLink et le texte de la requête.

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

Cette requête renvoie également tous les documents de la collection entière, mais nous n'appelons pas .ToList sur CreateDocumentQuery comme auparavant, ce qui émettrait autant de requêtes que nécessaire pour extraire tous les résultats dans une seule ligne de code.

Step 2 - Au lieu de cela, appelez AsDocumentQuery et cette méthode retourne un objet de requête avec une propriété HasMoreResults.

Step 3 - Si HasMoreResults est vrai, alors appelez ExecuteNextAsync pour obtenir le morceau suivant, puis videz tout le contenu de ce morceau.

Step 4- Vous pouvez également interroger en utilisant LINQ au lieu de SQL si vous préférez. Ici, nous avons défini une requête LINQ dans q, mais elle ne s'exécutera pas tant que nous n'exécuterons pas .ToList dessus.

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

Le SDK convertira notre requête LINQ en syntaxe SQL pour DocumentDB, générant une clause SELECT et WHERE basée sur notre syntaxe LINQ

Step 5 - Appelez maintenant les requêtes ci-dessus à partir de la tâche 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); 
   } 
	
}

Lorsque le code ci-dessus est exécuté, vous recevrez la sortie suivante.

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