📅  最后修改于: 2020-11-28 13:46:41             🧑  作者: Mango
在DocumentDB中,我们实际上是使用SQL来查询文档,因此本章全部涉及使用DocumentDB中的特殊SQL语法进行查询。尽管如果您正在进行.NET开发,也可以使用LINQ提供程序,并且可以从LINQ查询生成适当的SQL。
Azure门户具有查询资源管理器,该查询资源管理器使您可以对DocumentDB数据库运行任何SQL查询。
从最简单的查询开始,我们将使用查询资源管理器来演示查询语言的许多不同功能。
步骤1-在数据库刀片中,单击以打开查询资源管理器刀片。
请记住,查询在集合的范围内运行,因此查询浏览器使您可以在此下拉列表中选择集合。
步骤2-选择较早使用门户创建的Families集合。
查询浏览器将使用此简单查询SELECT * FROM c打开,该查询仅从集合中检索所有文档。
步骤3-通过单击“运行查询”按钮执行此查询。然后,您将看到在“结果”刀片中检索到了完整的文档。
以下是使用.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(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