DocumentDB - Документ запроса
В DocumentDB мы фактически используем SQL для запроса документов, поэтому эта глава посвящена запросам с использованием специального синтаксиса SQL в DocumentDB. Хотя, если вы занимаетесь разработкой .NET, существует также поставщик LINQ, который можно использовать и который может генерировать соответствующий SQL из запроса LINQ.
Запрос документа с помощью портала
На портале Azure есть обозреватель запросов, который позволяет запускать любой SQL-запрос к базе данных DocumentDB.
Мы будем использовать Query Explorer, чтобы продемонстрировать множество различных возможностей и возможностей языка запросов, начиная с самого простого запроса.
Step 1 - В колонке базы данных щелкните, чтобы открыть колонку Query Explorer.
Помните, что запросы выполняются в рамках коллекции, поэтому Query Explorer позволяет вам выбрать коллекцию в этом раскрывающемся списке.
Step 2 - Выберите коллекцию Семей, созданную ранее с помощью портала.
Обозреватель запросов открывается с помощью этого простого запроса SELECT * FROM c, который просто извлекает все документы из коллекции.
Step 3- Выполните этот запрос, нажав кнопку «Выполнить запрос». После этого вы увидите, что в колонке «Результаты» будет получен полный документ.
Запрос документа с использованием .Net SDK
Ниже приведены шаги для выполнения некоторых запросов к документам с помощью .Net SDK.
В этом примере мы хотим запросить только что созданные документы, которые мы только что добавили.
Step 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();
}
Этот запрос также возвращает все документы во всей коллекции, но мы не вызываем .ToList для CreateDocumentQuery, как раньше, который будет выдавать столько запросов, сколько необходимо для получения всех результатов в одной строке кода.
Step 2 - Вместо этого вызовите AsDocumentQuery, и этот метод вернет объект запроса со свойством HasMoreResults.
Step 3 - Если HasMoreResults истинно, вызовите ExecuteNextAsync, чтобы получить следующий фрагмент, а затем выгрузить все содержимое этого фрагмента.
Step 4- Вы также можете запросить, используя LINQ вместо SQL, если хотите. Здесь мы определили запрос LINQ в q, но он не будет выполняться, пока мы не запустим для него .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 в синтаксис SQL для DocumentDB, генерируя предложения SELECT и WHERE на основе нашего синтаксиса LINQ.
Step 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