DocumentDB - 查询文档

在DocumentDB中,我们实际上使用SQL来查询文档,因此本章是关于使用DocumentDB中的特殊SQL语法进行查询的全部内容.虽然如果您正在进行.NET开发,但还有一个可以使用的LINQ提供程序,它可以从LINQ查询生成适当的SQL.

使用Portal查询文档

Azure门户有一个查询资源管理器,允许您对DocumentDB数据库运行任何SQL查询.

我们将使用查询资源管理器演示许多不同的功能和特性从最简单的查询开始的查询语言.

第1步 : 在数据库刀片中,单击以打开查询资源管理器刀片.

查询资源管理器刀片

请记住,查询在集合范围内运行,因此查询资源管理器允许您在此下拉列表中选择集合.

运行查询

步骤2 : 选择之前使用门户创建的Families集合.

使用此简单查询SELECT * FROM c打开查询资源管理器,它只是从集合中检索所有文档.

第3步 : 单击"运行查询"按钮执行此查询.然后您将看到在结果刀片中检索到完整的文档.

结果刀片中的文档

使用.Net SDK查询文档

以下是使用.Net SDK运行某些文档查询的步骤.

In在这个例子中,我们想查询刚刚添加的新创建的文档.

步骤1 : 调用CreateDocumentQuery,传入集合以通过其SelfLink和查询文本运行查询.

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

此查询还返回整个集合中的所有文档,但我们不像以前那样在CreateDocumentQuery上调用.ToList,发出尽可能多的请求,以便在一行代码中下拉所有结果.

第2步 : 相反,调用AsDocumentQuery并且此方法返回具有HasMoreResults属性的查询对象.

步骤3 : 如果HasMoreResults为true,则调用ExecuteNextAsync以获取下一个块,然后转储该块的所有内容.

步骤4 : 如果您愿意,还可以使用LINQ而不是SQL进行查询.这里我们在q中定义了一个LINQ查询,但是直到我们在它上面运行.ToList才会执行.

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

SDK会将我们的LINQ查询转换为DocumentDB的SQL语法,根据我们的LINQ语法生成SELECT和WHERE子句

第5步 : 现在从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); 
   } 
	
}

执行上述代码时,您将收到以下输出.

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