- 文档数据库教程
- DocumentDB - 主页
- DocumentDB - 简介
- DocumentDB - 优点
- DocumentDB - 环境设置
- DocumentDB - 创建帐户
- DocumentDB - 连接帐户
- DocumentDB - 创建数据库
- DocumentDB - 列出数据库
- DocumentDB - 删除数据库
- DocumentDB - 创建集合
- DocumentDB - 删除集合
- DocumentDB - 插入文档
- DocumentDB - 查询文档
- DocumentDB - 更新文档
- DocumentDB - 删除文档
- DocumentDB - 数据建模
- DocumentDB - 数据类型
- DocumentDB - 限制记录
- DocumentDB - 记录排序
- DocumentDB - 索引记录
- DocumentDB - 地理空间数据
- DocumentDB - 分区
- DocumentDB - 数据迁移
- DocumentDB - 访问控制
- DocumentDB - 可视化数据
- DocumentDB 有用资源
- DocumentDB - 快速指南
- DocumentDB - 有用的资源
- DocumentDB - 讨论
DocumentDB - 查询文档
在DocumentDB中,我们实际上使用SQL来查询文档,因此本章主要讲述使用DocumentDB中特殊的SQL语法进行查询。不过,如果您正在进行 .NET 开发,还可以使用 LINQ 提供程序,它可以从 LINQ 查询生成适当的 SQL。
使用Portal查询文档
Azure 门户有一个查询资源管理器,可让你针对 DocumentDB 数据库运行任何 SQL 查询。
我们将使用查询资源管理器从最简单的查询开始,演示查询语言的许多不同功能和特性。
步骤 1 - 在数据库边栏选项卡中,单击以打开“查询资源管理器”边栏选项卡。
请记住,查询在集合范围内运行,因此查询资源管理器允许您在此下拉列表中选择集合。
步骤 2 - 选择之前使用门户创建的家庭集合。
查询资源管理器将打开这个简单的查询 SELECT * FROM c,它只是从集合中检索所有文档。
步骤 3 - 通过单击“运行查询”按钮执行此查询。然后您将看到在“结果”边栏选项卡中检索到完整的文档。
使用.Net SDK查询文档
以下是使用 .Net SDK 运行一些文档查询的步骤。
在此示例中,我们要查询刚刚添加的新创建的文档。
步骤 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