DocumentDB - zapytanie o dokument
W usłudze DocumentDB faktycznie używamy SQL do tworzenia zapytań o dokumenty, więc ten rozdział dotyczy zapytań przy użyciu specjalnej składni SQL w DocumentDB. Chociaż jeśli tworzysz programowanie .NET, istnieje również dostawca LINQ, którego można użyć i który może generować odpowiedni kod SQL z zapytania LINQ.
Zapytanie o dokument za pomocą portalu
Portal Azure zawiera Eksplorator zapytań, który umożliwia uruchamianie dowolnego zapytania SQL w bazie danych DocumentDB.
Użyjemy Eksploratora zapytań, aby zademonstrować wiele różnych możliwości i funkcji języka zapytań, zaczynając od najprostszego możliwego zapytania.
Step 1 - W bloku bazy danych kliknij, aby otworzyć blok Eksplorator zapytań.
Pamiętaj, że zapytania są uruchamiane w zakresie kolekcji, dlatego Eksplorator zapytań umożliwia wybranie kolekcji z tego menu.
Step 2 - Wybierz kolekcję Rodziny, która została utworzona wcześniej przy użyciu portalu.
Eksplorator zapytań otwiera się za pomocą tego prostego zapytania SELECT * FROM c, które po prostu pobiera wszystkie dokumenty z kolekcji.
Step 3- Wykonaj zapytanie, klikając przycisk „Uruchom zapytanie”. Następnie zobaczysz, że cały dokument jest pobierany w bloku Wyniki.
Zapytanie o dokument przy użyciu .Net SDK
Poniżej przedstawiono kroki uruchamiania niektórych zapytań dotyczących dokumentów przy użyciu .Net SDK.
W tym przykładzie chcemy zapytać o nowo utworzone dokumenty, które właśnie dodaliśmy.
Step 1 - Wywołaj CreateDocumentQuery, przekazując kolekcję, w której zostanie uruchomione zapytanie za pomocą SelfLink i tekstu zapytania.
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();
}
To zapytanie zwraca również wszystkie dokumenty w całej kolekcji, ale nie wywołujemy .ToList w CreateDocumentQuery jak poprzednio, co spowodowałoby wysłanie tylu żądań, ile potrzeba, aby pobrać wszystkie wyniki w jednej linii kodu.
Step 2 - Zamiast tego wywołaj AsDocumentQuery, a ta metoda zwraca obiekt zapytania z właściwością HasMoreResults.
Step 3 - Jeśli HasMoreResults ma wartość true, wywołaj ExecuteNextAsync, aby pobrać następną porcję, a następnie zrzuć całą zawartość tej porcji.
Step 4- Jeśli wolisz, możesz również wykonywać zapytania przy użyciu LINQ zamiast SQL. Tutaj zdefiniowaliśmy zapytanie LINQ w q, ale nie zostanie ono wykonane, dopóki nie uruchomimy na nim .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 przekształci nasze zapytanie LINQ w składnię SQL dla DocumentDB, generując klauzulę SELECT i WHERE na podstawie naszej składni LINQ
Step 5 - Teraz wywołaj powyższe zapytania z zadania 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);
}
}
Po wykonaniu powyższego kodu otrzymasz następujące dane wyjściowe.
**** 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