DocumentDB - Hướng dẫn nhanh
Trong chương này, chúng ta sẽ thảo luận ngắn gọn về các khái niệm chính xung quanh NoSQL và cơ sở dữ liệu tài liệu. Chúng ta cũng sẽ có một cái nhìn tổng quan nhanh về DocumentDB.
Cơ sở dữ liệu tài liệu NoSQL
DocumentDB là cơ sở dữ liệu tài liệu NoSQL mới nhất của Microsoft, vì vậy khi bạn nói cơ sở dữ liệu tài liệu NoSQL thì chúng ta muốn nói chính xác về NoSQL và cơ sở dữ liệu tài liệu là gì?
SQL có nghĩa là Ngôn ngữ truy vấn có cấu trúc, là ngôn ngữ truy vấn truyền thống của cơ sở dữ liệu quan hệ. SQL thường được coi là cơ sở dữ liệu quan hệ.
Thực sự hữu ích hơn khi coi cơ sở dữ liệu NoSQL là cơ sở dữ liệu không quan hệ, vì vậy NoSQL thực sự có nghĩa là không quan hệ.
Có nhiều loại cơ sở dữ liệu NoSQL khác nhau bao gồm các cửa hàng giá trị chính như:
- Lưu trữ bảng Azure.
- Các cửa hàng dựa trên cột như Cassandra.
- Cơ sở dữ liệu đồ thị như NEO4.
- Cơ sở dữ liệu tài liệu như MongoDB và Azure DocumentDB.
Tài liệu AzureDB
Microsoft chính thức ra mắt Azure DocumentDB vào ngày 08 tháng 4 lần thứ 2015, và nó chắc chắn có thể được mô tả như một cơ sở dữ liệu tài liệu NoSQL điển hình. Nó có khả năng mở rộng lớn và hoạt động với các tài liệu JSON không có giản đồ.
DocumentDB là một dịch vụ cơ sở dữ liệu tài liệu NoSQL thực sự không có lược đồ được thiết kế cho các ứng dụng web và di động hiện đại.
Nó cũng cung cấp khả năng đọc và ghi nhanh nhất quán, tính linh hoạt của lược đồ và khả năng dễ dàng mở rộng cơ sở dữ liệu lên và xuống theo yêu cầu.
Nó không giả định hoặc yêu cầu bất kỳ lược đồ nào cho các tài liệu JSON mà nó lập chỉ mục.
DocumentDB tự động lập chỉ mục mọi thuộc tính trong tài liệu ngay sau khi tài liệu được thêm vào cơ sở dữ liệu.
DocumentDB cho phép các truy vấn đặc biệt phức tạp bằng cách sử dụng ngôn ngữ SQL và mọi tài liệu đều có thể truy vấn ngay lập tức khi nó được tạo và bạn có thể tìm kiếm trên bất kỳ thuộc tính nào ở bất kỳ đâu trong hệ thống phân cấp tài liệu.
DocumentDB - Định giá
DocumentDB được lập hóa đơn dựa trên số lượng bộ sưu tập có trong tài khoản cơ sở dữ liệu. Mỗi tài khoản có thể có một hoặc nhiều cơ sở dữ liệu và mỗi cơ sở dữ liệu có thể có số lượng bộ sưu tập hầu như không giới hạn, mặc dù có hạn ngạch mặc định ban đầu là 100. Hạn ngạch này có thể được nâng lên bằng cách liên hệ với bộ phận hỗ trợ của Azure.
Bộ sưu tập không chỉ là một đơn vị quy mô mà còn là một đơn vị chi phí, vì vậy trong DocumentDB bạn phải trả cho mỗi bộ sưu tập có dung lượng lưu trữ lên đến 10 GB.
Ít nhất, bạn sẽ cần một bộ sưu tập S1 để lưu trữ tài liệu trong cơ sở dữ liệu có giá khoảng 25 đô la mỗi tháng, được tính phí dựa trên đăng ký Azure của bạn.
Khi cơ sở dữ liệu của bạn tăng kích thước và vượt quá 10 GB, bạn sẽ cần mua một bộ sưu tập khác để chứa dữ liệu bổ sung.
Mỗi bộ sưu tập S1 sẽ cung cấp cho bạn 250 đơn vị yêu cầu mỗi giây và nếu điều đó là không đủ, thì bạn có thể mở rộng bộ sưu tập lên đến S2 và nhận được 1000 đơn vị yêu cầu mỗi giây với giá khoảng 50 đô la một tháng.
Bạn cũng có thể biến nó thành S3 và trả khoảng 100 đô la một tháng.
DocumentDB nổi bật với một số khả năng rất độc đáo. Azure DocumentDB cung cấp các khả năng và lợi ích chính sau đây.
Giản đồ miễn phí
Trong cơ sở dữ liệu quan hệ, mỗi bảng đều có một lược đồ xác định các cột và kiểu dữ liệu mà mỗi hàng trong bảng phải tuân theo.
Ngược lại, cơ sở dữ liệu tài liệu không có lược đồ xác định và mọi tài liệu có thể được cấu trúc khác nhau.
Cú pháp SQL
DocumentDB cho phép các truy vấn đặc biệt phức tạp bằng cách sử dụng ngôn ngữ SQL và mọi tài liệu đều có thể truy vấn ngay lập tức tại thời điểm nó được tạo. Bạn có thể tìm kiếm trên bất kỳ thuộc tính nào ở bất kỳ đâu trong hệ thống phân cấp tài liệu.
Tính nhất quán có thể điều chỉnh được
Nó cung cấp một số mức độ nhất quán chi tiết, được xác định rõ ràng, cho phép bạn cân bằng giữa tính nhất quán, tính khả dụng và độ trễ.
Bạn có thể chọn từ bốn mức nhất quán được xác định rõ để đạt được sự cân bằng tối ưu giữa tính nhất quán và hiệu suất. Đối với các truy vấn và thao tác đọc, DocumentDB cung cấp bốn mức nhất quán riêng biệt -
- Strong
- Bounded-staleness
- Session
- Eventual
Quy mô đàn hồi
Khả năng mở rộng là tên của trò chơi với NoSQL và DocumentDB cung cấp. DocumentDB đã được chứng minh quy mô của nó.
Các dịch vụ chính như Office OneNote và Xbox đã được hỗ trợ bởi DocumentDB với cơ sở dữ liệu chứa hàng chục terabyte tài liệu JSON, hơn một triệu người dùng đang hoạt động và hoạt động ổn định với mức độ khả dụng 99,95%.
Bạn có thể mở rộng quy mô DocumentDB một cách đàn hồi với hiệu suất có thể dự đoán được bằng cách tạo nhiều đơn vị hơn khi ứng dụng của bạn phát triển.
Được quản lý hoàn toàn
DocumentDB có sẵn dưới dạng nền tảng dựa trên đám mây được quản lý hoàn toàn dưới dạng dịch vụ chạy trên Azure.
Đơn giản là không có gì để bạn cài đặt hoặc quản lý.
Không có máy chủ, cáp, không có hệ điều hành hoặc bản cập nhật để xử lý, không có bản sao để thiết lập.
Microsoft thực hiện tất cả những công việc đó và giữ cho dịch vụ hoạt động.
Trong vòng vài phút, bạn có thể bắt đầu làm việc với DocumentDB chỉ bằng trình duyệt và đăng ký Azure.
Microsoft cung cấp phiên bản Visual Studio miễn phí cũng chứa SQL Server và có thể tải xuống từ https://www.visualstudio.com
Cài đặt
Step 1- Sau khi tải xong, hãy chạy trình cài đặt. Hộp thoại sau sẽ được hiển thị.
Step 2 - Bấm vào nút Install và nó sẽ bắt đầu quá trình cài đặt.
Step 3 - Sau khi quá trình cài đặt hoàn tất thành công, bạn sẽ thấy hộp thoại sau.
Step 4 - Đóng hộp thoại này và khởi động lại máy tính của bạn nếu được yêu cầu.
Step 5- Bây giờ mở Visual studio từ Start Menu sẽ mở hộp thoại bên dưới. Lần đầu tiên sẽ mất một khoảng thời gian chỉ để chuẩn bị.
Sau khi hoàn tất, bạn sẽ thấy cửa sổ chính của Visual Studio.
Step 6 - Hãy tạo một dự án mới từ File → New → Project.
Step 7 - Chọn Ứng dụng bảng điều khiển, nhập DocumentDBDemo vào trường Tên và nhấp vào nút OK.
Step 8 - Trong giải pháp Explorer, nhấp chuột phải vào dự án của bạn.
Step 9 - Chọn Quản lý Gói NuGet sẽ mở cửa sổ sau trong Visual Studio và trong hộp nhập Tìm kiếm Trực tuyến, tìm Thư viện Máy khách DocumentDB.
Step 10 - Cài đặt phiên bản mới nhất bằng cách nhấp vào nút cài đặt.
Step 11- Nhấp vào “Tôi chấp nhận”. Sau khi cài đặt xong, bạn sẽ thấy thông báo trong cửa sổ đầu ra của mình.
Bây giờ bạn đã sẵn sàng để bắt đầu ứng dụng của mình.
Để sử dụng Microsoft Azure DocumentDB, bạn phải tạo tài khoản DocumentDB. Trong chương này, chúng ta sẽ tạo tài khoản DocumentDB bằng cổng Azure.
Step 1 - Đăng nhập trực tuyến https://portal.azure.com nếu bạn đã có đăng ký Azure, nếu không, trước tiên bạn cần đăng nhập.
Bạn sẽ thấy Trang tổng quan chính. Nó hoàn toàn có thể tùy chỉnh để bạn có thể sắp xếp các ô này theo bất kỳ cách nào bạn muốn, thay đổi kích thước, thêm và xóa các ô cho những thứ bạn thường xuyên sử dụng hoặc không còn làm nữa.
Step 2 - Chọn tùy chọn 'Mới' ở phía trên bên trái của trang.
Step 3 - Bây giờ chọn tùy chọn Data + Storage> Azure DocumentDB và bạn thấy phần tài khoản New DocumentDB sau đây.
Chúng tôi cần đưa ra một tên duy nhất trên toàn cầu (ID), kết hợp với .documents.azure.com là điểm cuối có thể truy cập công khai cho tài khoản DocumentDB của chúng tôi. Tất cả các cơ sở dữ liệu chúng tôi tạo bên dưới tài khoản đó có thể được truy cập qua internet bằng điểm cuối này.
Step 4 - Đặt tên là azuredocdbdemo và nhấp vào Nhóm tài nguyên → nguồn_mới.
Step 5- Chọn vị trí, tức là trung tâm dữ liệu Microsoft mà bạn muốn lưu trữ tài khoản này. Chọn vị trí và chọn khu vực của bạn.
Step 6 - Chọn hộp kiểm Ghim vào bảng điều khiển và chỉ cần tiếp tục và nhấp vào nút Tạo.
Bạn có thể thấy rằng ô đã được thêm vào Trang tổng quan và nó cho chúng tôi biết rằng tài khoản đang được tạo. Thực sự có thể mất vài phút để thiết lập mọi thứ cho một tài khoản mới trong khi DocumentDB phân bổ điểm cuối, các bản sao dự phòng và thực hiện các công việc khác trong nền.
Sau khi hoàn tất, bạn sẽ thấy bảng điều khiển.
Step 7 - Bây giờ hãy nhấp vào tài khoản DocumentDB đã tạo và bạn sẽ thấy màn hình chi tiết như hình sau.
Khi bạn bắt đầu lập trình với DocumentDB, bước đầu tiên là kết nối. Vì vậy, để kết nối với tài khoản DocumentDB của bạn, bạn sẽ cần hai thứ;
- Endpoint
- Khóa ủy quyền
Điểm cuối
Điểm cuối là URL đến tài khoản DocumentDB của bạn và nó được tạo bằng cách kết hợp tên tài khoản DocumentDB của bạn với .documents.azure.com. Hãy chuyển đến Trang tổng quan.
Bây giờ, hãy nhấp vào tài khoản DocumentDB đã tạo. Bạn sẽ thấy các chi tiết như trong hình ảnh sau đây.
Khi bạn chọn tùy chọn 'Phím', nó sẽ hiển thị thông tin bổ sung như trong hình sau. Bạn cũng sẽ thấy URL đến tài khoản DocumentDB của mình, bạn có thể sử dụng URL này làm điểm cuối của mình.
Khóa ủy quyền
Khóa ủy quyền chứa thông tin xác thực của bạn và có hai loại khóa. Khóa chính cho phép truy cập đầy đủ vào tất cả các tài nguyên trong tài khoản, trong khi mã thông báo tài nguyên cho phép truy cập hạn chế vào các tài nguyên cụ thể.
Chìa khóa chính
Bạn không thể làm gì với khóa chính. Bạn có thể thổi bay toàn bộ cơ sở dữ liệu của mình nếu muốn bằng cách sử dụng khóa chính.
Vì lý do này, bạn chắc chắn không muốn chia sẻ khóa chính hoặc phân phối nó cho các môi trường máy khách. Là một biện pháp bảo mật bổ sung, bạn nên thay đổi nó thường xuyên.
Thực tế có hai khóa chính cho mỗi tài khoản cơ sở dữ liệu, khóa chính và khóa phụ như được đánh dấu trong ảnh chụp màn hình ở trên.
Mã thông báo tài nguyên
Bạn cũng có thể sử dụng mã thông báo tài nguyên thay vì khóa chính.
Các kết nối dựa trên mã thông báo tài nguyên chỉ có thể truy cập các tài nguyên được chỉ định bởi mã thông báo và không có tài nguyên nào khác.
Mã thông báo tài nguyên dựa trên quyền của người dùng, vì vậy trước tiên bạn tạo một hoặc nhiều người dùng và những người dùng này được xác định ở cấp cơ sở dữ liệu.
Bạn tạo một hoặc nhiều quyền cho mỗi người dùng, dựa trên tài nguyên mà bạn muốn cho phép mỗi người dùng truy cập.
Mỗi quyền tạo ra một mã thông báo tài nguyên cho phép truy cập chỉ đọc hoặc toàn quyền vào một tài nguyên nhất định và đó có thể là bất kỳ tài nguyên người dùng nào trong cơ sở dữ liệu.
Hãy chuyển đến ứng dụng console đã tạo trong chương 3.
Step 1 - Thêm các tham chiếu sau trong tệp Program.cs.
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Newtonsoft.Json;
Step 2- Bây giờ thêm URL điểm cuối và khóa ủy quyền. Trong ví dụ này, chúng tôi sẽ sử dụng khóa chính làm khóa Ủy quyền.
Lưu ý rằng trong trường hợp của bạn, cả URL Điểm cuối và khóa ủy quyền phải khác nhau.
private const string EndpointUrl = "https://azuredocdbdemo.documents.azure.com:443/";
private const string AuthorizationKey =
"BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
Step 3 - Tạo một phiên bản mới của DocumentClient trong tác vụ không đồng bộ được gọi là CreateDocumentClient và khởi tạo DocumentClient mới.
Step 4 - Gọi tác vụ không đồng bộ của bạn từ phương thức Chính của bạn.
Sau đây là toàn bộ tệp Program.cs cho đến nay.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Newtonsoft.Json;
namespace DocumentDBDemo {
class Program {
private const string EndpointUrl = "https://azuredocdbdemo.documents.azure.com:443/";
private const string AuthorizationKey = "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/
StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
static void Main(string[] args) {
try {
CreateDocumentClient().Wait();
} catch (Exception e) {
Exception baseException = e.GetBaseException();
Console.WriteLine("Error: {0}, Message: {1}", e.Message, baseException.Message);
}
Console.ReadKey();
}
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey);
}
}
}
Trong chương này, chúng ta đã học cách kết nối với tài khoản DocumentDB và tạo một phiên bản của lớp DocumentClient.
Trong chương này, chúng ta sẽ học cách tạo cơ sở dữ liệu. Để sử dụng Microsoft Azure DocumentDB, bạn phải có tài khoản DocumentDB, cơ sở dữ liệu, bộ sưu tập và tài liệu. Chúng tôi đã có tài khoản DocumentDB, bây giờ để tạo cơ sở dữ liệu, chúng tôi có hai tùy chọn:
- Cổng Microsoft Azure hoặc
- .Net SDK
Tạo cơ sở dữ liệu cho DocumentDB bằng Microsoft Azure Portal
Để tạo cơ sở dữ liệu bằng cách sử dụng cổng thông tin, sau đây là các bước.
Step 1 - Đăng nhập vào cổng Azure và bạn sẽ thấy bảng điều khiển.
Step 2 - Bây giờ hãy nhấp vào tài khoản DocumentDB đã tạo và bạn sẽ thấy các chi tiết như được hiển thị trong ảnh chụp màn hình sau.
Step 3 - Chọn tùy chọn Thêm cơ sở dữ liệu và cung cấp ID cho cơ sở dữ liệu của bạn.
Step 4 - Bấm OK.
Bạn có thể thấy rằng cơ sở dữ liệu đã được thêm vào. Hiện tại, nó không có bộ sưu tập, nhưng chúng tôi có thể thêm các bộ sưu tập sau đó là các bộ chứa sẽ lưu trữ các tài liệu JSON của chúng tôi. Lưu ý rằng nó có cả ID và ID tài nguyên.
Tạo cơ sở dữ liệu cho DocumentDB bằng .Net SDK
Để tạo cơ sở dữ liệu bằng .Net SDK, sau đây là các bước.
Step 1 - Mở Ứng dụng Bảng điều khiển trong Visual Studio từ chương cuối cùng.
Step 2- Tạo cơ sở dữ liệu mới bằng cách tạo một đối tượng cơ sở dữ liệu mới. Để tạo cơ sở dữ liệu mới, chúng ta chỉ cần gán thuộc tính Id, thuộc tính mà chúng ta đang đặt thành “mynewdb” trong tác vụ CreateDatabase.
private async static Task CreateDatabase(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("******** Create Database *******");
var databaseDefinition = new Database { Id = "mynewdb" };
var result = await client.CreateDatabaseAsync(databaseDefinition);
var database = result.Resource;
Console.WriteLine(" Database Id: {0}; Rid: {1}", database.Id, database.ResourceId);
Console.WriteLine("******** Database Created *******");
}
Step 3- Bây giờ chuyển databaseDefinition này sang CreateDatabaseAsync và nhận lại kết quả với thuộc tính Resource. Tất cả các phương thức đối tượng tạo trả về thuộc tính Tài nguyên mô tả mục đã được tạo, là cơ sở dữ liệu trong trường hợp này.
Chúng tôi lấy đối tượng cơ sở dữ liệu mới từ thuộc tính Tài nguyên và nó được hiển thị trên Bảng điều khiển cùng với ID tài nguyên mà DocumentDB đã gán cho nó.
Step 4 - Bây giờ gọi tác vụ CreateDatabase từ tác vụ CreateDocumentClient sau khi DocumentClient được khởi tạo.
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await CreateDatabase(client);
}
Sau đây là toàn bộ tệp Program.cs cho đến nay.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Newtonsoft.Json;
namespace DocumentDBDemo {
class Program {
private const string EndpointUrl = "https://azuredocdbdemo.documents.azure.com:443/";
private const string AuthorizationKey = "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/
StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
static void Main(string[] args) {
try {
CreateDocumentClient().Wait();
} catch (Exception e) {
Exception baseException = e.GetBaseException();
Console.WriteLine("Error: {0}, Message: {1}", e.Message, baseException.Message);
}
Console.ReadKey();
}
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await CreateDatabase(client);
}
}
private async static Task CreateDatabase(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("******** Create Database *******");
var databaseDefinition = new Database { Id = "mynewdb" };
var result = await client.CreateDatabaseAsync(databaseDefinition);
var database = result.Resource;
Console.WriteLine(" Database Id: {0}; Rid: {1}", database.Id, database.ResourceId);
Console.WriteLine("******** Database Created *******");
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau chứa ID cơ sở dữ liệu và tài nguyên.
******** Create Database *******
Database Id: mynewdb; Rid: ltpJAA==
******** Database Created *******
Cho đến nay, chúng tôi đã tạo hai cơ sở dữ liệu trong tài khoản DocumentDB của mình, một cơ sở dữ liệu đầu tiên được tạo bằng cổng Azure trong khi cơ sở dữ liệu thứ hai được tạo bằng .Net SDK. Bây giờ để xem các cơ sở dữ liệu này, bạn có thể sử dụng cổng Azure.
Truy cập tài khoản DocumentDB của bạn trên cổng Azure và bạn sẽ thấy hai cơ sở dữ liệu ngay bây giờ.
Bạn cũng có thể xem hoặc liệt kê các cơ sở dữ liệu từ mã của mình bằng cách sử dụng .Net SDK. Sau đây là các bước liên quan.
Step 1 - Đưa ra một Truy vấn cơ sở dữ liệu không có tham số trả về một danh sách đầy đủ, nhưng bạn cũng có thể chuyển vào một truy vấn để tìm kiếm một cơ sở dữ liệu cụ thể hoặc các cơ sở dữ liệu cụ thể.
private static void GetDatabases(DocumentClient client) {
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("******** Get Databases List ********");
var databases = client.CreateDatabaseQuery().ToList();
foreach (var database in databases) {
Console.WriteLine(" Database Id: {0}; Rid: {1}", database.Id, database.ResourceId);
}
Console.WriteLine();
Console.WriteLine("Total databases: {0}", databases.Count);
}
Bạn sẽ thấy rằng có một loạt các phương thức CreateQuery này để định vị bộ sưu tập, tài liệu, người dùng và các tài nguyên khác. Các phương thức này không thực sự thực thi truy vấn, chúng chỉ xác định truy vấn và trả về một đối tượng có thể lặp lại.
Đó là lời gọi ToList () thực thi truy vấn, lặp lại kết quả và trả về chúng trong một danh sách.
Step 2 - Gọi phương thức GetDatabases từ tác vụ CreateDocumentClient sau khi DocumentClient được khởi tạo.
Step 3 - Bạn cũng cần nhận xét tác vụ CreateDatabase hoặc thay đổi id cơ sở dữ liệu, nếu không bạn sẽ nhận được thông báo lỗi rằng cơ sở dữ liệu tồn tại.
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
//await CreateDatabase(client);
GetDatabases(client);
}
Sau đây là toàn bộ tệp Program.cs cho đến nay.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Newtonsoft.Json;
namespace DocumentDBDemo {
class Program {
private const string EndpointUrl = "https://azuredocdbdemo.documents.azure.com:443/";
private const string AuthorizationKey = "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/
StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
static void Main(string[] args) {
try {
CreateDocumentClient().Wait();
} catch (Exception e) {
Exception baseException = e.GetBaseException();
Console.WriteLine("Error: {0}, Message: {1}", e.Message, baseException.Message);
}
Console.ReadKey();
}
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await CreateDatabase(client);
GetDatabases(client);
}
}
private async static Task CreateDatabase(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("******** Create Database *******");
var databaseDefinition = new Database { Id = "mynewdb" };
var result = await client.CreateDatabaseAsync(databaseDefinition);
var database = result.Resource;
Console.WriteLine(" Database Id: {0}; Rid: {1}", database.Id, database.ResourceId);
Console.WriteLine("******** Database Created *******");
}
private static void GetDatabases(DocumentClient client) {
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("******** Get Databases List ********");
var databases = client.CreateDatabaseQuery().ToList();
foreach (var database in databases) {
Console.WriteLine(" Database Id: {0}; Rid: {1}",
database.Id, database.ResourceId);
}
Console.WriteLine();
Console.WriteLine("Total databases: {0}", databases.Count);
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau chứa ID Cơ sở dữ liệu và Tài nguyên của cả hai cơ sở dữ liệu. Cuối cùng, bạn cũng sẽ thấy tổng số cơ sở dữ liệu.
******** Get Databases List ********
Database Id: myfirstdb; Rid: Ic8LAA==
Database Id: mynewdb; Rid: ltpJAA==
Total databases: 2
Bạn có thể loại bỏ cơ sở dữ liệu hoặc các cơ sở dữ liệu từ cổng thông tin cũng như từ mã bằng cách sử dụng .Net SDK. Ở đây, chúng ta sẽ thảo luận từng bước về cách thả cơ sở dữ liệu trong DocumentDB.
Step 1- Chuyển đến tài khoản DocumentDB của bạn trên cổng Azure. Với mục đích demo, tôi đã thêm hai cơ sở dữ liệu khác như được thấy trong ảnh chụp màn hình sau.
Step 2- Để thả cơ sở dữ liệu nào, bạn cần bấm vào cơ sở dữ liệu đó. Hãy chọn tempdb, bạn sẽ thấy trang sau, chọn tùy chọn 'Xóa cơ sở dữ liệu'.
Step 3 - Nó sẽ hiển thị thông báo xác nhận, bây giờ hãy nhấp vào nút 'Có'.
Bạn sẽ thấy rằng tempdb không còn khả dụng trong trang tổng quan của bạn.
Bạn cũng có thể xóa cơ sở dữ liệu khỏi mã của mình bằng .Net SDK. Để làm theo các bước sau.
Step 1 - Hãy xóa cơ sở dữ liệu bằng cách chỉ định ID của cơ sở dữ liệu mà chúng ta muốn xóa, nhưng chúng ta cần SelfLink của nó.
Step 2 - Chúng tôi đang gọi CreateDatabaseQuery như trước đây, nhưng lần này chúng tôi thực sự cung cấp một truy vấn để trả về chỉ một cơ sở dữ liệu có ID tempdb1.
private async static Task DeleteDatabase(DocumentClient client) {
Console.WriteLine("******** Delete Database ********");
Database database = client
.CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 'tempdb1'")
.AsEnumerable()
.First();
await client.DeleteDatabaseAsync(database.SelfLink);
}
Step 3- Lần này, chúng ta có thể gọi AsEnumerable thay vì ToList () vì chúng ta không thực sự cần một đối tượng danh sách. Chỉ mong đợi kết quả, gọi AsEnumerable là đủ để chúng ta có thể lấy đối tượng cơ sở dữ liệu đầu tiên được trả về bởi truy vấn với First (). Đây là đối tượng cơ sở dữ liệu cho tempdb1 và nó có SelfLink mà chúng ta có thể sử dụng để gọi DeleteDatabaseAsync sẽ xóa cơ sở dữ liệu.
Step 4 - Bạn cũng cần gọi tác vụ DeleteDatabase từ tác vụ CreateDocumentClient sau khi DocumentClient được khởi tạo.
Step 5 - Để xem danh sách các cơ sở dữ liệu sau khi xóa cơ sở dữ liệu đã chỉ định, chúng ta hãy gọi lại phương thức GetDatabases.
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
//await CreateDatabase(client);
GetDatabases(client);
await DeleteDatabase(client);
GetDatabases(client);
}
Sau đây là toàn bộ tệp Program.cs cho đến nay.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Newtonsoft.Json;
namespace DocumentDBDemo {
class Program {
private const string EndpointUrl = "https://azuredocdbdemo.documents.azure.com:443/";
private const string AuthorizationKey = "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/
StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
static void Main(string[] args) {
try {
CreateDocumentClient().Wait();
} catch (Exception e) {
Exception baseException = e.GetBaseException();
Console.WriteLine("Error: {0}, Message: {1}", e.Message, baseException.Message);
}
Console.ReadKey();
}
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
//await CreateDatabase(client);
GetDatabases(client);
await DeleteDatabase(client);
GetDatabases(client);
}
}
private async static Task CreateDatabase(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("******** Create Database *******");
var databaseDefinition = new Database { Id = "mynewdb" };
var result = await client.CreateDatabaseAsync(databaseDefinition);
var database = result.Resource;
Console.WriteLine(" Database Id: {0}; Rid: {1}",
database.Id, database.ResourceId);
Console.WriteLine("******** Database Created *******");
}
private static void GetDatabases(DocumentClient client) {
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("******** Get Databases List ********");
var databases = client.CreateDatabaseQuery().ToList();
foreach (var database in databases) {
Console.WriteLine(" Database Id: {0}; Rid: {1}", database.Id,
database.ResourceId);
}
Console.WriteLine();
Console.WriteLine("Total databases: {0}", databases.Count);
}
private async static Task DeleteDatabase(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("******** Delete Database ********");
Database database = client
.CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 'tempdb1'")
.AsEnumerable()
.First();
await client.DeleteDatabaseAsync(database.SelfLink);
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau chứa ID Cơ sở dữ liệu và Tài nguyên của ba cơ sở dữ liệu và tổng số cơ sở dữ liệu.
******** Get Databases List ********
Database Id: myfirstdb; Rid: Ic8LAA==
Database Id: mynewdb; Rid: ltpJAA==
Database Id: tempdb1; Rid: 06JjAA==
Total databases: 3
******** Delete Database ********
******** Get Databases List ********
Database Id: myfirstdb; Rid: Ic8LAA==
Database Id: mynewdb; Rid: ltpJAA==
Total databases: 2
Sau khi xóa cơ sở dữ liệu, bạn cũng sẽ thấy ở cuối chỉ còn lại hai cơ sở dữ liệu trong tài khoản DocumentDB.
Trong chương này, chúng ta sẽ học cách tạo một bộ sưu tập. Nó tương tự như tạo cơ sở dữ liệu. Bạn có thể tạo một bộ sưu tập từ cổng thông tin hoặc từ mã bằng cách sử dụng .Net SDK.
Step 1 - Chuyển đến bảng điều khiển chính trên cổng Azure.
Step 2 - Chọn myfirstdb từ danh sách cơ sở dữ liệu.
Step 3- Nhấp vào tùy chọn 'Thêm Bộ sưu tập' và chỉ định ID cho bộ sưu tập. Chọn Bậc định giá cho tùy chọn khác.
Step 4 - Chọn Chuẩn S1 và nhấp vào nút Chọn → OK.
Như bạn có thể thấy rằng MyCollection được thêm vào myfirstdb.
Bạn cũng có thể tạo bộ sưu tập từ mã bằng cách sử dụng .Net SDK. Hãy xem các bước sau để thêm bộ sưu tập từ mã.
Step 1 - Mở ứng dụng Console trong Visual Studio.
Step 2 - Để tạo một tập hợp, trước tiên hãy truy xuất cơ sở dữ liệu myfirstdb theo ID của nó trong tác vụ 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();
await CreateCollection(client, "MyCollection1");
await CreateCollection(client, "MyCollection2", "S2");
}
}
Sau đây là thực hiện cho tác vụ CreateCollection.
private async static Task CreateCollection(DocumentClient client, string collectionId,
string offerType = "S1") {
Console.WriteLine();
Console.WriteLine("**** Create Collection {0} in {1} ****", collectionId, database.Id);
var collectionDefinition = new DocumentCollection { Id = collectionId };
var options = new RequestOptions { OfferType = offerType };
var result = await client.CreateDocumentCollectionAsync(database.SelfLink,
collectionDefinition, options);
var collection = result.Resource;
Console.WriteLine("Created new collection");
ViewCollection(collection);
}
Chúng tôi tạo một đối tượng DocumentCollection mới xác định bộ sưu tập mới với Id mong muốn cho phương thức CreateDocumentCollectionAsync, phương thức này cũng chấp nhận một tham số tùy chọn mà chúng tôi đang sử dụng ở đây để đặt mức hiệu suất của bộ sưu tập mới, mà chúng tôi đang gọi là offerType.
Điều này mặc định là S1 và vì chúng tôi không chuyển trong offerType, cho MyCollection1, vì vậy đây sẽ là một tập hợp S1 và cho MyCollection2, chúng tôi đã vượt qua S2 để biến cái này thành S2 như hình trên.
Sau đây là việc thực hiện phương thức ViewCollection.
private static void ViewCollection(DocumentCollection collection) {
Console.WriteLine("Collection ID: {0} ", collection.Id);
Console.WriteLine("Resource ID: {0} ", collection.ResourceId);
Console.WriteLine("Self Link: {0} ", collection.SelfLink);
Console.WriteLine("Documents Link: {0} ", collection.DocumentsLink);
Console.WriteLine("UDFs Link: {0} ", collection.UserDefinedFunctionsLink);
Console.WriteLine(" StoredProcs Link: {0} ", collection.StoredProceduresLink);
Console.WriteLine("Triggers Link: {0} ", collection.TriggersLink);
Console.WriteLine("Timestamp: {0} ", collection.Timestamp);
}
Sau đây là việc triển khai hoàn chỉnh tệp program.cs cho các bộ sưu tập.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Newtonsoft.Json;
namespace DocumentDBDemo {
class Program {
private const string EndpointUrl = "https://azuredocdbdemo.documents.azure.com:443/";
private const string AuthorizationKey = "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/
StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
private static Database database;
static void Main(string[] args) {
try {
CreateDocumentClient().Wait();
} catch (Exception e) {
Exception baseException = e.GetBaseException();
Console.WriteLine("Error: {0}, Message: {1}", e.Message, baseException.Message);
}
Console.ReadKey();
}
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();
await CreateCollection(client, "MyCollection1");
await CreateCollection(client, "MyCollection2", "S2");
//await CreateDatabase(client);
//GetDatabases(client);
//await DeleteDatabase(client);
//GetDatabases(client);
}
}
private async static Task CreateCollection(DocumentClient client,
string collectionId, string offerType = "S1") {
Console.WriteLine();
Console.WriteLine("**** Create Collection {0} in {1} ****", collectionId,
database.Id);
var collectionDefinition = new DocumentCollection { Id = collectionId };
var options = new RequestOptions { OfferType = offerType };
var result = await
client.CreateDocumentCollectionAsync(database.SelfLink,
collectionDefinition, options);
var collection = result.Resource;
Console.WriteLine("Created new collection");
ViewCollection(collection);
}
private static void ViewCollection(DocumentCollection collection) {
Console.WriteLine("Collection ID: {0} ", collection.Id);
Console.WriteLine("Resource ID: {0} ", collection.ResourceId);
Console.WriteLine("Self Link: {0} ", collection.SelfLink);
Console.WriteLine("Documents Link: {0} ", collection.DocumentsLink);
Console.WriteLine("UDFs Link: {0} ", collection.UserDefinedFunctionsLink);
Console.WriteLine("StoredProcs Link: {0} ", collection.StoredProceduresLink);
Console.WriteLine("Triggers Link: {0} ", collection.TriggersLink);
Console.WriteLine("Timestamp: {0} ", collection.Timestamp);
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau chứa tất cả thông tin liên quan đến bộ sưu tập.
**** Create Collection MyCollection1 in myfirstdb ****
Created new collection
Collection ID: MyCollection1
Resource ID: Ic8LAPPvnAA=
Self Link: dbs/Ic8LAA==/colls/Ic8LAPPvnAA=/
Documents Link: dbs/Ic8LAA==/colls/Ic8LAPPvnAA=/docs/
UDFs Link: dbs/Ic8LAA==/colls/Ic8LAPPvnAA=/udfs/
StoredProcs Link: dbs/Ic8LAA==/colls/Ic8LAPPvnAA=/sprocs/
Triggers Link: dbs/Ic8LAA==/colls/Ic8LAPPvnAA=/triggers/
Timestamp: 12/10/2015 4:55:36 PM
**** Create Collection MyCollection2 in myfirstdb ****
Created new collection
Collection ID: MyCollection2
Resource ID: Ic8LAKGHDwE=
Self Link: dbs/Ic8LAA==/colls/Ic8LAKGHDwE=/
Documents Link: dbs/Ic8LAA==/colls/Ic8LAKGHDwE=/docs/
UDFs Link: dbs/Ic8LAA==/colls/Ic8LAKGHDwE=/udfs/
StoredProcs Link: dbs/Ic8LAA==/colls/Ic8LAKGHDwE=/sprocs/
Triggers Link: dbs/Ic8LAA==/colls/Ic8LAKGHDwE=/triggers/
Timestamp: 12/10/2015 4:55:38 PM
Để bỏ bộ sưu tập hoặc bộ sưu tập, bạn có thể thực hiện tương tự từ cổng thông tin cũng như từ mã bằng cách sử dụng .Net SDK.
Step 1- Chuyển đến tài khoản DocumentDB của bạn trên cổng Azure. Với mục đích demo, tôi đã thêm hai bộ sưu tập nữa như được thấy trong ảnh chụp màn hình sau.
Step 2- Để thả bộ sưu tập nào, bạn cần nhấp vào bộ sưu tập đó. Hãy chọn TempCollection1. Bạn sẽ thấy trang sau, chọn tùy chọn 'Xóa Bộ sưu tập'.
Step 3- Nó sẽ hiển thị thông báo xác nhận. Bây giờ hãy nhấp vào nút 'Có'.
Bạn sẽ thấy rằng TempCollection1 không còn khả dụng trên trang tổng quan của bạn.
Bạn cũng có thể xóa các bộ sưu tập khỏi mã của mình bằng cách sử dụng .Net SDK. Để làm điều đó, hãy làm theo các bước sau.
Step 1 - Hãy xóa bộ sưu tập bằng cách chỉ định ID của bộ sưu tập mà chúng ta muốn xóa.
Đây là kiểu truy vấn thông thường theo Id để lấy các selfLinks cần thiết để xóa tài nguyên.
private async static Task DeleteCollection(DocumentClient client, string collectionId) {
Console.WriteLine();
Console.WriteLine("**** Delete Collection {0} in {1} ****", collectionId, database.Id);
var query = new SqlQuerySpec {
QueryText = "SELECT * FROM c WHERE c.id = @id",
Parameters = new SqlParameterCollection {
new SqlParameter {
Name = "@id", Value = collectionId
}
}
};
DocumentCollection collection = client.CreateDocumentCollectionQuery(database.SelfLink,
query).AsEnumerable().First();
await client.DeleteDocumentCollectionAsync(collection.SelfLink);
Console.WriteLine("Deleted collection {0} from database {1}", collectionId,
database.Id);
}
Ở đây, chúng ta thấy cách ưa thích để xây dựng một truy vấn tham số hóa. Chúng tôi không mã hóa cứng collectionId vì vậy phương pháp này có thể được sử dụng để xóa bất kỳ bộ sưu tập nào. Chúng tôi đang truy vấn một tập hợp cụ thể theo Id trong đó tham số Id được xác định trong SqlParameterCollection này được gán cho thuộc tính của tham số của SqlQuerySpec này.
Sau đó, SDK thực hiện công việc xây dựng chuỗi truy vấn cuối cùng cho DocumentDB với collectionId được nhúng bên trong nó.
Step 2 - Chạy truy vấn và sau đó sử dụng SelfLink của nó để xóa bộ sưu tập khỏi tác vụ 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();
await DeleteCollection(client, "TempCollection");
}
}
Sau đây là quá trình triển khai hoàn chỉnh của tệp Program.cs.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Newtonsoft.Json;
namespace DocumentDBDemo {
class Program {
private const string EndpointUrl = "https://azuredocdbdemo.documents.azure.com:443/";
private const string AuthorizationKey = "BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/
StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
private static Database database;
static void Main(string[] args) {
try {
CreateDocumentClient().Wait();
} catch (Exception e) {
Exception baseException = e.GetBaseException();
Console.WriteLine("Error: {0}, Message: {1}", e.Message, baseException.Message);
}
Console.ReadKey();
}
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();
await DeleteCollection(client, "TempCollection");
//await CreateCollection(client, "MyCollection1");
//await CreateCollection(client, "MyCollection2", "S2");
////await CreateDatabase(client);
//GetDatabases(client);
//await DeleteDatabase(client);
//GetDatabases(client);
}
}
private async static Task CreateCollection(DocumentClient client,
string collectionId, string offerType = "S1") {
Console.WriteLine();
Console.WriteLine("**** Create Collection {0} in {1} ****", collectionId,
database.Id);
var collectionDefinition = new DocumentCollection { Id = collectionId };
var options = new RequestOptions { OfferType = offerType };
var result = await client.CreateDocumentCollectionAsync(database.SelfLink,
collectionDefinition, options);
var collection = result.Resource;
Console.WriteLine("Created new collection");
ViewCollection(collection);
}
private static void ViewCollection(DocumentCollection collection) {
Console.WriteLine("Collection ID: {0} ", collection.Id);
Console.WriteLine("Resource ID: {0} ", collection.ResourceId);
Console.WriteLine("Self Link: {0} ", collection.SelfLink);
Console.WriteLine("Documents Link: {0} ", collection.DocumentsLink);
Console.WriteLine("UDFs Link: {0} ", collection.UserDefinedFunctionsLink);
Console.WriteLine("StoredProcs Link: {0} ", collection.StoredProceduresLink);
Console.WriteLine("Triggers Link: {0} ", collection.TriggersLink);
Console.WriteLine("Timestamp: {0} ", collection.Timestamp);
}
private async static Task DeleteCollection(DocumentClient client,
string collectionId) {
Console.WriteLine();
Console.WriteLine("**** Delete Collection {0} in {1} ****", collectionId,
database.Id);
var query = new SqlQuerySpec {
QueryText = "SELECT * FROM c WHERE c.id = @id", Parameters = new
SqlParameterCollection {
new SqlParameter {
Name = "@id", Value = collectionId
}
}
};
DocumentCollection collection = client.CreateDocumentCollectionQuery
(database.SelfLink, query).AsEnumerable().First();
await client.DeleteDocumentCollectionAsync(collection.SelfLink);
Console.WriteLine("Deleted collection {0} from database {1}", collectionId,
database.Id);
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** Delete Collection TempCollection in myfirstdb ****
Deleted collection TempCollection from database myfirstdb
Trong chương này, chúng ta sẽ làm việc với các tài liệu thực tế trong một bộ sưu tập. Bạn có thể tạo tài liệu bằng cổng Azure hoặc .Net SDK.
Tạo tài liệu với Azure Portal
Hãy cùng xem các bước sau để thêm tài liệu vào bộ sưu tập của bạn.
Step 1 - Thêm bộ sưu tập mới Các họ của bậc định giá S1 trong myfirstdb.
Step 2 - Chọn bộ sưu tập Gia đình và nhấp vào tùy chọn Tạo Tài liệu để mở thanh Tài liệu Mới.
Đây chỉ là một trình soạn thảo văn bản đơn giản cho phép bạn nhập bất kỳ JSON nào cho một tài liệu mới.
Step 3 - Vì đây là mục nhập dữ liệu thô, chúng ta hãy nhập tài liệu đầu tiên của chúng ta.
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{ "firstName": "Thomas", "relationship": "father" },
{ "firstName": "Mary Kay", "relationship": "mother" }
],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [ { "givenName": "Fluffy", "type": "Rabbit" } ]
}
],
"location": { "state": "WA", "county": "King", "city": "Seattle"},
"isRegistered": true
}
Khi bạn nhập tài liệu trên, bạn sẽ thấy màn hình sau.
Lưu ý rằng chúng tôi đã cung cấp một id cho tài liệu. Giá trị id luôn là bắt buộc và nó phải là duy nhất trên tất cả các tài liệu khác trong cùng một bộ sưu tập. Khi bạn bỏ nó ra thì DocumentDB sẽ tự động tạo một mã cho bạn bằng cách sử dụng GUID hoặc Mã nhận dạng duy nhất trên toàn cầu.
Id luôn là một chuỗi và nó không thể là một số, ngày tháng, Boolean hoặc một đối tượng khác và nó không được dài hơn 255 ký tự.
Cũng lưu ý cấu trúc phân cấp của tài liệu có một vài thuộc tính cấp cao nhất như id bắt buộc, cũng như lastName và isRegistered, nhưng nó cũng có các thuộc tính lồng nhau.
Ví dụ: thuộc tính cha mẹ được cung cấp dưới dạng mảng JSON như được biểu thị bằng dấu ngoặc vuông. Chúng tôi cũng có một mảng khác cho trẻ em, mặc dù chỉ có một mảng con trong mảng trong ví dụ này.
Step 4 - Nhấp vào nút 'Lưu' để lưu tài liệu và chúng tôi đã tạo tài liệu đầu tiên của mình.
Như bạn có thể thấy rằng định dạng đẹp đã được áp dụng cho JSON của chúng tôi, định dạng này sẽ chia nhỏ mọi thuộc tính trên dòng riêng của nó được thụt lề với khoảng trắng để truyền tải mức lồng ghép của từng thuộc tính.
Cổng bao gồm một Trình khám phá Tài liệu, vì vậy hãy sử dụng nó ngay bây giờ để truy xuất tài liệu mà chúng tôi vừa tạo.
Step 5- Chọn một cơ sở dữ liệu và bất kỳ bộ sưu tập nào trong cơ sở dữ liệu để xem các tài liệu trong bộ sưu tập đó. Chúng tôi hiện chỉ có một cơ sở dữ liệu có tên myfirstdb với một bộ sưu tập được gọi là Gia đình, cả hai đều đã được chọn trước ở đây trong trình đơn thả xuống.
Theo mặc định, Trình khám phá tài liệu hiển thị danh sách tài liệu chưa được lọc trong bộ sưu tập, nhưng bạn cũng có thể tìm kiếm bất kỳ tài liệu cụ thể nào theo ID hoặc nhiều tài liệu dựa trên tìm kiếm theo ký tự đại diện của một phần ID.
Chúng tôi chỉ có một tài liệu trong bộ sưu tập của mình cho đến nay và chúng tôi thấy ID của nó trên màn hình sau, AndersonFamily.
Step 6 - Bấm vào ID để xem tài liệu.
Tạo tài liệu với .NET SDK
Như bạn biết rằng tài liệu chỉ là một loại tài nguyên khác và bạn đã làm quen với cách xử lý tài nguyên bằng SDK.
Một sự khác biệt lớn giữa tài liệu và các tài nguyên khác là tất nhiên, chúng không có giản đồ.
Vì vậy, có rất nhiều lựa chọn. Đương nhiên, bạn có thể chỉ làm việc với đồ thị đối tượng JSON hoặc thậm chí các chuỗi thô của văn bản JSON, nhưng bạn cũng có thể sử dụng các đối tượng động cho phép bạn liên kết với các thuộc tính trong thời gian chạy mà không cần xác định lớp tại thời điểm biên dịch.
Bạn cũng có thể làm việc với các đối tượng C # thực hoặc các Đối tượng như chúng được gọi, có thể là các lớp miền doanh nghiệp của bạn.
Hãy bắt đầu tạo tài liệu bằng .Net SDK. Sau đây là các bước.
Step 1 - Khởi tạo DocumentClient sau đó chúng tôi sẽ truy vấn cơ sở dữ liệu myfirstdb và sau đó truy vấn bộ sưu tập MyCollection, chúng tôi lưu trữ trong bộ sưu tập biến riêng này để nó có thể truy cập được trong toàn bộ lớp.
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);
}
}
Step 2 - Tạo một số tài liệu trong tác vụ CreateDocuments.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
dynamic document1Definition = new {
name = "New Customer 1", address = new {
addressType = "Main Office",
addressLine1 = "123 Main Street",
location = new {
city = "Brooklyn", stateProvinceName = "New York"
}, postalCode = "11229", countryRegionName = "United States"
},
};
Document document1 = await CreateDocument(client, document1Definition);
Console.WriteLine("Created document {0} from dynamic object", document1.Id);
Console.WriteLine();
}
Tài liệu đầu tiên sẽ được tạo từ đối tượng động này. Điều này có thể trông giống như JSON, nhưng tất nhiên là không. Đây là mã C # và chúng tôi đang tạo một đối tượng .NET thực, nhưng không có định nghĩa lớp. Thay vào đó, các thuộc tính được suy ra từ cách khởi tạo đối tượng.
Lưu ý rằng chúng tôi chưa cung cấp thuộc tính Id cho tài liệu này.
Bây giờ chúng ta hãy xem xét CreateDocument. Nó trông giống như mẫu mà chúng ta đã thấy để tạo cơ sở dữ liệu và bộ sưu tập.
private async static Task<Document> CreateDocument(DocumentClient client,
object documentObject) {
var result = await client.CreateDocumentAsync(collection.SelfLink, documentObject);
var document = result.Resource;
Console.WriteLine("Created new document: {0}\r\n{1}", document.Id, document);
return result;
}
Step 3- Lần này chúng tôi gọi CreateDocumentAsync chỉ định SelfLink của bộ sưu tập mà chúng tôi muốn thêm tài liệu vào. Chúng tôi nhận được phản hồi có thuộc tính tài nguyên, trong trường hợp này, đại diện cho tài liệu mới với các thuộc tính do hệ thống tạo ra.
Đối tượng Document là một lớp được xác định trong SDK kế thừa từ tài nguyên và vì vậy nó có tất cả các thuộc tính tài nguyên chung, nhưng nó cũng bao gồm các thuộc tính động xác định chính tài liệu không có lược đồ.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
dynamic document1Definition = new {
name = "New Customer 1", address = new {
addressType = "Main Office",
addressLine1 = "123 Main Street",
location = new {
city = "Brooklyn", stateProvinceName = "New York"
}, postalCode = "11229", countryRegionName = "United States"
},
};
Document document1 = await CreateDocument(client, document1Definition);
Console.WriteLine("Created document {0} from dynamic object", document1.Id);
Console.WriteLine();
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** Create Documents ****
Created new document: 34e9873a-94c8-4720-9146-d63fb7840fad {
"name": "New Customer 1",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn", "stateProvinceName": "New York"
},
"postalCode": "11229", "countryRegionName": "United States"
},
"id": "34e9873a-94c8-4720-9146-d63fb7840fad",
"_rid": "Ic8LAMEUVgACAAAAAAAAAA==",
"_ts": 1449812756,
"_self": "dbs/Ic8LAA==/colls/Ic8LAMEUVgA=/docs/Ic8LAMEUVgACAAAAAAAAAA==/",
"_etag": "\"00001000-0000-0000-0000-566a63140000\"",
"_attachments": "attachments/"
}
Created document 34e9873a-94c8-4720-9146-d63fb7840fad from dynamic object
Như bạn có thể thấy, chúng tôi chưa cung cấp Id, tuy nhiên DocumentDB đã tạo Id này cho chúng tôi cho tài liệu mới.
Trong DocumentDB, chúng tôi thực sự sử dụng SQL để truy vấn tài liệu, vì vậy chương này là tất cả về truy vấn bằng cú pháp SQL đặc biệt trong DocumentDB. Mặc dù nếu bạn đang phát triển .NET, thì cũng có một trình cung cấp LINQ có thể được sử dụng và có thể tạo SQL thích hợp từ một truy vấn LINQ.
Truy vấn tài liệu bằng Cổng thông tin
Cổng Azure có Trình khám phá truy vấn cho phép bạn chạy bất kỳ truy vấn SQL nào dựa trên cơ sở dữ liệu DocumentDB của bạn.
Chúng tôi sẽ sử dụng Trình khám phá truy vấn để chứng minh nhiều khả năng và tính năng khác nhau của ngôn ngữ truy vấn bắt đầu với truy vấn đơn giản nhất có thể.
Step 1 - Trong phiến cơ sở dữ liệu, bấm để mở phiến Query Explorer.
Hãy nhớ rằng các truy vấn chạy trong phạm vi của một bộ sưu tập và do đó, Trình khám phá Truy vấn cho phép bạn chọn bộ sưu tập trong menu thả xuống này.
Step 2 - Chọn bộ sưu tập Gia đình được tạo trước đó bằng cổng thông tin.
Trình khám phá truy vấn mở ra với truy vấn đơn giản SELECT * FROM c này, truy vấn này chỉ đơn giản là lấy tất cả các tài liệu từ bộ sưu tập.
Step 3- Thực hiện truy vấn này bằng cách nhấp vào nút 'Chạy truy vấn'. Sau đó, bạn sẽ thấy rằng tài liệu hoàn chỉnh được truy xuất trong thanh Kết quả.
Truy vấn tài liệu bằng .Net SDK
Sau đây là các bước để chạy một số truy vấn tài liệu bằng .Net SDK.
Trong ví dụ này, chúng tôi muốn truy vấn các tài liệu mới được tạo mà chúng tôi vừa thêm vào.
Step 1 - Gọi CreateDocumentQuery, truyền vào bộ sưu tập để chạy truy vấn bằng SelfLink của nó và văn bản truy vấn.
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();
}
Truy vấn này cũng trả lại tất cả các tài liệu trong toàn bộ bộ sưu tập, nhưng chúng tôi không gọi .ToList trên CreateDocumentQuery như trước đây, điều này sẽ đưa ra nhiều yêu cầu nếu cần để kéo xuống tất cả kết quả trong một dòng mã.
Step 2 - Thay vào đó, hãy gọi AsDocumentQuery và phương thức này trả về một đối tượng truy vấn có thuộc tính HasMoreResults.
Step 3 - Nếu HasMoreResults là true, hãy gọi ExecuteNextAsync để lấy đoạn tiếp theo rồi kết xuất tất cả nội dung của đoạn đó.
Step 4- Bạn cũng có thể truy vấn bằng LINQ thay vì SQL nếu muốn. Ở đây chúng tôi đã xác định một truy vấn LINQ trong q, nhưng nó sẽ không thực thi cho đến khi chúng tôi chạy. Danh sách trên đó.
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 sẽ chuyển đổi truy vấn LINQ của chúng tôi thành cú pháp SQL cho DocumentDB, tạo mệnh đề SELECT và WHERE dựa trên cú pháp LINQ của chúng tôi
Step 5 - Bây giờ gọi các truy vấn trên từ tác vụ 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);
}
}
Khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau.
**** 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
Trong chương này, chúng ta sẽ học cách cập nhật các tài liệu. Sử dụng cổng Azure, bạn có thể dễ dàng cập nhật tài liệu bằng cách mở tài liệu trong Trình khám phá tài liệu và cập nhật nó trong trình chỉnh sửa như một tệp văn bản.
Nhấp vào nút 'Lưu'. Bây giờ khi bạn cần thay đổi một tài liệu bằng .Net SDK, bạn chỉ cần thay thế nó. Bạn không cần phải xóa và tạo lại nó, điều này ngoài việc tẻ nhạt, cũng sẽ thay đổi id tài nguyên, điều mà bạn sẽ không muốn làm khi chỉ sửa đổi một tài liệu. Dưới đây là các bước sau để cập nhật tài liệu bằng .Net SDK.
Hãy xem tác vụ ReplaceDocuments sau đây, nơi chúng tôi sẽ truy vấn các tài liệu có thuộc tính isNew là true, nhưng chúng tôi sẽ không nhận được gì vì không có bất kỳ tài liệu nào. Vì vậy, hãy sửa đổi các tài liệu chúng tôi đã thêm trước đó, những tài liệu có tên bắt đầu bằng Khách hàng mới.
Step 1 - Thêm thuộc tính isNew vào các tài liệu này và đặt giá trị của nó thành true.
private async static Task ReplaceDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine(">>> Replace Documents <<<");
Console.WriteLine();
Console.WriteLine("Quering for documents with 'isNew' flag");
var sql = "SELECT * FROM c WHERE c.isNew = true";
var documents = client.CreateDocumentQuery(collection.SelfLink, sql).ToList();
Console.WriteLine("Documents with 'isNew' flag: {0} ", documents.Count);
Console.WriteLine();
Console.WriteLine("Quering for documents to be updated");
sql = "SELECT * FROM c WHERE STARTSWITH(c.name, 'New Customer') = true";
documents = client.CreateDocumentQuery(collection.SelfLink, sql).ToList();
Console.WriteLine("Found {0} documents to be updated", documents.Count);
foreach (var document in documents) {
document.isNew = true;
var result = await client.ReplaceDocumentAsync(document._self, document);
var updatedDocument = result.Resource;
Console.WriteLine("Updated document 'isNew' flag: {0}", updatedDocument.isNew);
}
Console.WriteLine();
Console.WriteLine("Quering for documents with 'isNew' flag");
sql = "SELECT * FROM c WHERE c.isNew = true";
documents = client.CreateDocumentQuery(collection.SelfLink, sql).ToList();
Console.WriteLine("Documents with 'isNew' flag: {0}: ", documents.Count);
Console.WriteLine();
}
Step 2 - Nhận các tài liệu được cập nhật bằng cách sử dụng cùng một truy vấn STARTSWITH và điều đó cung cấp cho chúng tôi các tài liệu mà chúng tôi đang lấy lại ở đây dưới dạng các đối tượng động.
Step 3 - Đính kèm thuộc tính isNew và đặt nó thành true cho mỗi tài liệu.
Step 4 - Gọi ReplaceDocumentAsync, chuyển vào SelfLink của tài liệu, cùng với tài liệu được cập nhật.
Bây giờ chỉ để chứng minh rằng điều này đã hiệu quả, hãy truy vấn các tài liệu trong đó isNew bằng true. Hãy gọi các truy vấn trên từ tác vụ 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);
//QueryDocumentsWithSql(client);
//await QueryDocumentsWithPaging(client);
//QueryDocumentsWithLinq(client);
await ReplaceDocuments(client);
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** Replace Documents ****
Quering for documents with 'isNew' flag
Documents with 'isNew' flag: 0
Quering for documents to be updated
Found 2 documents to be updated
Updated document ‘isNew’ flag: True
Updated document ‘isNew’ flag: True
Quering for documents with 'isNew' flag
Documents with 'isNew' flag: 2
Trong chương này, chúng ta sẽ tìm hiểu cách xóa tài liệu khỏi tài khoản DocumentDB của bạn. Sử dụng Azure Portal, bạn có thể dễ dàng xóa bất kỳ tài liệu nào bằng cách mở tài liệu đó trong Document Explorer và nhấp vào tùy chọn 'Xóa'.
Nó sẽ hiển thị thông báo xác nhận. Bây giờ nhấn nút Có và bạn sẽ thấy rằng tài liệu không còn có sẵn trong tài khoản DocumentDB của bạn nữa.
Bây giờ khi bạn muốn xóa một tài liệu bằng .Net SDK.
Step 1- Đó là mô hình giống như chúng ta đã thấy trước đây, nơi chúng ta sẽ truy vấn đầu tiên để lấy các Liên kết tự của mỗi tài liệu mới. Chúng tôi không sử dụng SELECT * ở đây, điều này sẽ trả về toàn bộ tài liệu mà chúng tôi không cần.
Step 2 - Thay vào đó, chúng tôi chỉ chọn các SelfLinks vào một danh sách và sau đó chúng tôi chỉ gọi DeleteDocumentAsync cho mỗi SelfLink, một cái tại một thời điểm, để xóa tài liệu khỏi bộ sưu tập.
private async static Task DeleteDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine(">>> Delete Documents <<<");
Console.WriteLine();
Console.WriteLine("Quering for documents to be deleted");
var sql =
"SELECT VALUE c._self FROM c WHERE STARTSWITH(c.name, 'New Customer') = true";
var documentLinks =
client.CreateDocumentQuery<string>(collection.SelfLink, sql).ToList();
Console.WriteLine("Found {0} documents to be deleted", documentLinks.Count);
foreach (var documentLink in documentLinks) {
await client.DeleteDocumentAsync(documentLink);
}
Console.WriteLine("Deleted {0} new customer documents", documentLinks.Count);
Console.WriteLine();
}
Step 3 - Bây giờ chúng ta hãy gọi DeleteDocuments ở trên từ tác vụ 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 DeleteDocuments(client);
}
}
Khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau.
***** Delete Documents *****
Quering for documents to be deleted
Found 2 documents to be deleted
Deleted 2 new customer documents
Mặc dù cơ sở dữ liệu không có lược đồ, như DocumentDB, giúp bạn dễ dàng nắm bắt các thay đổi đối với mô hình dữ liệu của mình, nhưng bạn vẫn nên dành một chút thời gian để suy nghĩ về dữ liệu của mình.
Bạn có rất nhiều lựa chọn. Đương nhiên, bạn có thể chỉ làm việc với đồ thị đối tượng JSON hoặc thậm chí các chuỗi thô của văn bản JSON, nhưng bạn cũng có thể sử dụng các đối tượng động cho phép bạn liên kết với các thuộc tính trong thời gian chạy mà không cần xác định lớp tại thời điểm biên dịch.
Bạn cũng có thể làm việc với các đối tượng C # thực hoặc các Đối tượng như chúng được gọi, có thể là các lớp miền doanh nghiệp của bạn.
Các mối quan hệ
Chúng ta hãy xem cấu trúc phân cấp của tài liệu. Nó có một số thuộc tính cấp cao nhất như id bắt buộc, cũng như lastName và isRegistered, nhưng nó cũng có các thuộc tính lồng nhau.
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{ "firstName": "Thomas", "relationship": "father" },
{ "firstName": "Mary Kay", "relationship": "mother" }
],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [ { "givenName": "Fluffy", "type": "Rabbit" } ]
}
],
"location": { "state": "WA", "county": "King", "city": "Seattle"},
"isRegistered": true
}
Ví dụ: thuộc tính cha mẹ được cung cấp dưới dạng mảng JSON như được biểu thị bằng dấu ngoặc vuông.
Chúng tôi cũng có một mảng khác cho trẻ em, mặc dù chỉ có một mảng con trong mảng trong ví dụ này. Vì vậy, đây là cách bạn lập mô hình tương đương với các mối quan hệ một-nhiều trong một tài liệu.
Bạn chỉ cần sử dụng các mảng trong đó mỗi phần tử trong mảng có thể là một giá trị đơn giản hoặc một đối tượng phức tạp khác, thậm chí là một mảng khác.
Vì vậy, một gia đình có thể có nhiều cha mẹ và nhiều con và nếu bạn nhìn vào các đối tượng con, chúng có thuộc tính vật nuôi, bản thân nó là một mảng lồng nhau cho mối quan hệ một-nhiều giữa trẻ em và vật nuôi.
Đối với thuộc tính vị trí, chúng tôi đang kết hợp ba thuộc tính có liên quan, tiểu bang, quận và thành phố vào một đối tượng.
Nhúng một đối tượng theo cách này thay vì nhúng một mảng đối tượng tương tự như có mối quan hệ một-một giữa hai hàng trong các bảng riêng biệt trong cơ sở dữ liệu quan hệ.
Nhúng dữ liệu
Khi bạn bắt đầu lập mô hình dữ liệu trong kho lưu trữ tài liệu, chẳng hạn như DocumentDB, hãy cố gắng coi các thực thể của bạn là tài liệu độc lập được đại diện trong JSON. Khi làm việc với cơ sở dữ liệu quan hệ, chúng tôi luôn chuẩn hóa dữ liệu.
Bình thường hóa dữ liệu của bạn thường bao gồm việc lấy một thực thể, chẳng hạn như khách hàng và chia nó thành các phần dữ liệu kín đáo, như chi tiết liên hệ và địa chỉ.
Để đọc một khách hàng, với tất cả các chi tiết và địa chỉ liên hệ của họ, bạn cần sử dụng JOINS để tổng hợp dữ liệu của mình một cách hiệu quả tại thời điểm chạy.
Bây giờ chúng ta hãy xem cách chúng ta sẽ lập mô hình dữ liệu giống như một thực thể độc lập trong cơ sở dữ liệu tài liệu.
{
"id": "1",
"firstName": "Mark",
"lastName": "Upston",
"addresses": [
{
"line1": "232 Main Street",
"line2": "Unit 1",
"city": "Brooklyn",
"state": "NY",
"zip": 11229
}
],
"contactDetails": [
{"email": "[email protected]"},
{"phone": "+1 356 545-86455", "extension": 5555}
]
}
Như bạn có thể thấy rằng chúng tôi đã không chuẩn hóa hồ sơ khách hàng trong đó tất cả thông tin của khách hàng được nhúng vào một tài liệu JSON duy nhất.
Trong NoSQL, chúng tôi có một lược đồ miễn phí, vì vậy bạn cũng có thể thêm chi tiết liên hệ và địa chỉ ở định dạng khác nhau. Trong NoSQL, bạn có thể truy xuất bản ghi khách hàng từ cơ sở dữ liệu chỉ trong một thao tác đọc. Tương tự, cập nhật một bản ghi cũng là một thao tác ghi duy nhất.
Sau đây là các bước để tạo tài liệu bằng .Net SDK.
Step 1- Khởi tạo DocumentClient. Sau đó, chúng tôi sẽ truy vấn cơ sở dữ liệu myfirstdb và cũng truy vấn cho bộ sưu tập MyCollection, bộ sưu tập mà chúng tôi lưu trữ trong bộ sưu tập biến riêng này để có thể truy cập được trong toàn bộ lớp.
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);
}
}
Step 2 - Tạo một số tài liệu trong tác vụ CreateDocuments.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
dynamic document1Definition = new {
name = "New Customer 1", address = new {
addressType = "Main Office",
addressLine1 = "123 Main Street",
location = new {
city = "Brooklyn", stateProvinceName = "New York"
},
postalCode = "11229", countryRegionName = "United States"
},
};
Document document1 = await CreateDocument(client, document1Definition);
Console.WriteLine("Created document {0} from dynamic object", document1.Id);
Console.WriteLine();
}
Tài liệu đầu tiên sẽ được tạo từ đối tượng động này. Điều này có thể trông giống như JSON, nhưng tất nhiên là không. Đây là mã C # và chúng tôi đang tạo một đối tượng .NET thực, nhưng không có định nghĩa lớp. Thay vào đó, các thuộc tính được suy ra từ cách khởi tạo đối tượng. Bạn cũng có thể nhận thấy rằng chúng tôi chưa cung cấp thuộc tính Id cho tài liệu này.
Step 3 - Bây giờ chúng ta hãy xem xét CreateDocument và nó trông giống như mẫu mà chúng ta đã thấy để tạo cơ sở dữ liệu và bộ sưu tập.
private async static Task<Document> CreateDocument(DocumentClient client,
object documentObject) {
var result = await client.CreateDocumentAsync(collection.SelfLink, documentObject);
var document = result.Resource;
Console.WriteLine("Created new document: {0}\r\n{1}", document.Id, document);
return result;
}
Step 4- Lần này chúng tôi gọi CreateDocumentAsync chỉ định SelfLink của bộ sưu tập mà chúng tôi muốn thêm tài liệu vào. Chúng tôi nhận được phản hồi có thuộc tính tài nguyên, trong trường hợp này, đại diện cho tài liệu mới với các thuộc tính do hệ thống tạo ra.
Trong tác vụ Tạo Tài liệu sau, chúng tôi đã tạo ba tài liệu.
Trong tài liệu đầu tiên, đối tượng Document là một lớp được xác định trong SDK kế thừa từ tài nguyên và vì vậy nó có tất cả các thuộc tính tài nguyên chung, nhưng nó cũng bao gồm các thuộc tính động xác định chính tài liệu không có lược đồ.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
dynamic document1Definition = new {
name = "New Customer 1", address = new {
addressType = "Main Office",
addressLine1 = "123 Main Street",
location = new {
city = "Brooklyn", stateProvinceName = "New York"
},
postalCode = "11229",
countryRegionName = "United States"
},
};
Document document1 = await CreateDocument(client, document1Definition);
Console.WriteLine("Created document {0} from dynamic object", document1.Id);
Console.WriteLine();
var document2Definition = @" {
""name"": ""New Customer 2"",
""address"": {
""addressType"": ""Main Office"",
""addressLine1"": ""123 Main Street"",
""location"": {
""city"": ""Brooklyn"", ""stateProvinceName"": ""New York""
},
""postalCode"": ""11229"",
""countryRegionName"": ""United States""
}
}";
Document document2 = await CreateDocument(client, document2Definition);
Console.WriteLine("Created document {0} from JSON string", document2.Id);
Console.WriteLine();
var document3Definition = new Customer {
Name = "New Customer 3",
Address = new Address {
AddressType = "Main Office",
AddressLine1 = "123 Main Street",
Location = new Location {
City = "Brooklyn", StateProvinceName = "New York"
},
PostalCode = "11229",
CountryRegionName = "United States"
},
};
Document document3 = await CreateDocument(client, document3Definition);
Console.WriteLine("Created document {0} from typed object", document3.Id);
Console.WriteLine();
}
Tài liệu thứ hai này chỉ hoạt động với một chuỗi JSON thô. Bây giờ chúng ta bước vào quá tải cho CreateDocument sử dụng JavaScriptSerializer để hủy tuần tự hóa chuỗi thành một đối tượng, sau đó nó chuyển sang cùng một phương thức CreateDocument mà chúng ta đã sử dụng để tạo tài liệu đầu tiên.
Trong tài liệu thứ ba, chúng tôi đã sử dụng đối tượng C # Khách hàng được định nghĩa trong ứng dụng của chúng tôi.
Hãy xem khách hàng này, nó có thuộc tính Id và địa chỉ trong đó địa chỉ là một đối tượng lồng nhau với các thuộc tính riêng của nó bao gồm vị trí, đây là một đối tượng lồng nhau khác.
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentDBDemo {
public class Customer {
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
// Must be nullable, unless generating unique values for new customers on client
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "address")]
public Address Address { get; set; }
}
public class Address {
[JsonProperty(PropertyName = "addressType")]
public string AddressType { get; set; }
[JsonProperty(PropertyName = "addressLine1")]
public string AddressLine1 { get; set; }
[JsonProperty(PropertyName = "location")]
public Location Location { get; set; }
[JsonProperty(PropertyName = "postalCode")]
public string PostalCode { get; set; }
[JsonProperty(PropertyName = "countryRegionName")]
public string CountryRegionName { get; set; }
}
public class Location {
[JsonProperty(PropertyName = "city")]
public string City { get; set; }
[JsonProperty(PropertyName = "stateProvinceName")]
public string StateProvinceName { get; set; }
}
}
Chúng tôi cũng có các thuộc tính thuộc tính JSON vì chúng tôi muốn duy trì các quy ước phù hợp ở cả hai bên của hàng rào.
Vì vậy, tôi chỉ tạo đối tượng Khách hàng mới của mình cùng với các đối tượng con lồng nhau của nó và gọi vào CreateDocument một lần nữa. Mặc dù đối tượng khách hàng của chúng tôi có thuộc tính Id, nhưng chúng tôi không cung cấp giá trị cho nó và vì vậy DocumentDB đã tạo một thuộc tính dựa trên GUID, giống như nó đã làm cho hai tài liệu trước.
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** Create Documents ****
Created new document: 575882f0-236c-4c3d-81b9-d27780206b2c
{
"name": "New Customer 1",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
"id": "575882f0-236c-4c3d-81b9-d27780206b2c",
"_rid": "kV5oANVXnwDGPgAAAAAAAA==",
"_ts": 1450037545,
"_self": "dbs/kV5oAA==/colls/kV5oANVXnwA=/docs/kV5oANVXnwDGPgAAAAAAAA==/",
"_etag": "\"00006fce-0000-0000-0000-566dd1290000\"",
"_attachments": "attachments/"
}
Created document 575882f0-236c-4c3d-81b9-d27780206b2c from dynamic object
Created new document: 8d7ad239-2148-4fab-901b-17a85d331056
{
"name": "New Customer 2",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
"id": "8d7ad239-2148-4fab-901b-17a85d331056",
"_rid": "kV5oANVXnwDHPgAAAAAAAA==",
"_ts": 1450037545,
"_self": "dbs/kV5oAA==/colls/kV5oANVXnwA=/docs/kV5oANVXnwDHPgAAAAAAAA==/",
"_etag": "\"000070ce-0000-0000-0000-566dd1290000\"",
"_attachments": "attachments/"
}
Created document 8d7ad239-2148-4fab-901b-17a85d331056 from JSON string
Created new document: 49f399a8-80c9-4844-ac28-cd1dee689968
{
"id": "49f399a8-80c9-4844-ac28-cd1dee689968",
"name": "New Customer 3",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
"_rid": "kV5oANVXnwDIPgAAAAAAAA==",
"_ts": 1450037546,
"_self": "dbs/kV5oAA==/colls/kV5oANVXnwA=/docs/kV5oANVXnwDIPgAAAAAAAA==/",
"_etag": "\"000071ce-0000-0000-0000-566dd12a0000\"",
"_attachments": "attachments/"
}
Created document 49f399a8-80c9-4844-ac28-cd1dee689968 from typed object
JSON hoặc JavaScript Object Notation là một tiêu chuẩn mở dựa trên văn bản nhẹ được thiết kế để trao đổi dữ liệu có thể đọc được của con người và cũng dễ dàng để máy móc phân tích cú pháp và tạo. JSON là trung tâm của DocumentDB. Chúng tôi truyền JSON qua dây, chúng tôi lưu trữ JSON dưới dạng JSON và chúng tôi lập chỉ mục cây JSON cho phép các truy vấn trên tài liệu JSON đầy đủ.
Định dạng JSON hỗ trợ các kiểu dữ liệu sau:
Không. | Loại & Mô tả |
---|---|
1 | Number Định dạng dấu phẩy động chính xác kép trong JavaScript |
2 | String Unicode được trích dẫn kép có thoát dấu gạch chéo ngược |
3 | Boolean Đúng hay sai |
4 | Array Một chuỗi giá trị có thứ tự |
5 | Value Nó có thể là một chuỗi, một số, đúng hoặc sai, null, v.v. |
6 | Object Một tập hợp không có thứ tự các cặp khóa: giá trị |
7 | Whitespace Nó có thể được sử dụng giữa bất kỳ cặp mã thông báo nào |
số 8 | Null Trống |
Chúng ta hãy xem một kiểu DateTime ví dụ đơn giản. Thêm ngày sinh vào lớp khách hàng.
public class Customer {
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
// Must be nullable, unless generating unique values for new customers on client
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "address")]
public Address Address { get; set; }
[JsonProperty(PropertyName = "birthDate")]
public DateTime BirthDate { get; set; }
}
Chúng ta có thể lưu trữ, truy xuất và truy vấn bằng DateTime như được hiển thị trong đoạn mã sau.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
var document3Definition = new Customer {
Id = "1001",
Name = "Luke Andrew",
Address = new Address {
AddressType = "Main Office",
AddressLine1 = "123 Main Street",
Location = new Location {
City = "Brooklyn",
StateProvinceName = "New York"
},
PostalCode = "11229",
CountryRegionName = "United States"
},
BirthDate = DateTime.Parse(DateTime.Today.ToString()),
};
Document document3 = await CreateDocument(client, document3Definition);
Console.WriteLine("Created document {0} from typed object", document3.Id);
Console.WriteLine();
}
Khi đoạn mã trên được biên dịch và thực thi, và tài liệu được tạo, bạn sẽ thấy ngày sinh đã được thêm ngay bây giờ.
**** Create Documents ****
Created new document: 1001
{
"id": "1001",
"name": "Luke Andrew",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
"birthDate": "2015-12-14T00:00:00",
"_rid": "Ic8LAMEUVgAKAAAAAAAAAA==",
"_ts": 1450113676,
"_self": "dbs/Ic8LAA==/colls/Ic8LAMEUVgA=/docs/Ic8LAMEUVgAKAAAAAAAAAA==/",
"_etag": "\"00002d00-0000-0000-0000-566efa8c0000\"",
"_attachments": "attachments/"
}
Created document 1001 from typed object
Microsoft gần đây đã thêm một số cải tiến về cách bạn có thể truy vấn Azure DocumentDB, chẳng hạn như từ khóa TOP đối với ngữ pháp SQL, làm cho các truy vấn chạy nhanh hơn và tiêu thụ ít tài nguyên hơn, tăng giới hạn cho toán tử truy vấn và thêm hỗ trợ cho các toán tử LINQ bổ sung trong .NET SDK.
Hãy xem một ví dụ đơn giản, trong đó chúng ta sẽ chỉ lấy hai bản ghi đầu tiên. Nếu bạn có một số bản ghi và bạn chỉ muốn truy xuất một số bản ghi, thì bạn có thể sử dụng từ khóa Top. Trong ví dụ này, chúng ta có rất nhiều hồ sơ về động đất.
Bây giờ chúng tôi chỉ muốn hiển thị hai bản ghi đầu tiên
Step 1 - Đi tới trình khám phá truy vấn và chạy truy vấn này.
SELECT * FROM c
WHERE c.magnitude > 2.5
Bạn sẽ thấy rằng nó đã truy xuất bốn bản ghi vì chúng tôi chưa chỉ định từ khóa TOP.
Step 2- Bây giờ sử dụng từ khóa TOP với cùng một truy vấn. Ở đây chúng tôi đã chỉ định từ khóa TOP và '2' có nghĩa là chúng tôi chỉ muốn có hai bản ghi.
SELECT TOP 2 * FROM c
WHERE c.magnitude > 2.5
Step 3 - Bây giờ chạy truy vấn này và bạn sẽ thấy rằng chỉ có hai bản ghi được truy xuất.
Tương tự, bạn có thể sử dụng từ khóa TOP trong mã sử dụng .Net SDK. Sau đây là cách thực hiện.
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 TOP 3 * 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(" PublicId: {0}; Magnitude: {1};", document.publicid,
document.magnitude);
}
}
Console.WriteLine();
}
Sau đây là tác vụ CreateDocumentClient trong đó khởi tạo DocumentClient và cơ sở dữ liệu động đất.
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 =
'earthquake'").AsEnumerable().First();
collection = client.CreateDocumentCollectionQuery(database.CollectionsLink,
"SELECT * FROM c WHERE c.id = 'earthquakedata'").AsEnumerable().First();
await QueryDocumentsWithPaging(client);
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy rằng chỉ có ba bản ghi được truy xuất.
**** Query Documents (paged results) ****
Quering for all documents
PublicId: 2015p947400; Magnitude: 2.515176918;
PublicId: 2015p947373; Magnitude: 1.506774108;
PublicId: 2015p947329; Magnitude: 1.593394461;
Microsoft Azure DocumentDB hỗ trợ truy vấn tài liệu bằng SQL trên tài liệu JSON. Bạn có thể sắp xếp tài liệu trong bộ sưu tập theo số và chuỗi bằng mệnh đề ORDER BY trong truy vấn của mình. Mệnh đề có thể bao gồm một đối số ASC / DESC tùy chọn để xác định thứ tự mà kết quả phải được truy xuất.
Hãy xem ví dụ sau, trong đó chúng ta có một tài liệu JSON.
{
"id": "Food Menu",
"description": "Grapes, red or green (European type, such as Thompson seedless), raw",
"tags": [
{
"name": "grapes"
},
{
"name": "red or green (european type"
},
{
"name": "such as thompson seedless)"
},
{
"name": "raw"
}
],
"foodGroup": "Fruits and Fruit Juices",
"servings": [
{
"amount": 1,
"description": "cup",
"weightInGrams": 151
},
{
"amount": 10,
"description": "grapes",
"weightInGrams": 49
},
{
"amount": 1,
"description": "NLEA serving",
"weightInGrams": 126
}
]
}
Sau đây là truy vấn SQL để sắp xếp kết quả theo thứ tự giảm dần.
SELECT f.description, f.foodGroup,
f.servings[2].description AS servingDescription,
f.servings[2].weightInGrams AS servingWeight
FROM f
ORDER BY f.servings[2].weightInGrams DESC
Khi truy vấn trên được thực thi, bạn sẽ nhận được kết quả sau.
[
{
"description": "Grapes, red or green (European type, such as Thompson
seedless), raw",
"foodGroup": "Fruits and Fruit Juices",
"servingDescription": "NLEA serving",
"servingWeight": 126
}
]
Theo mặc định, DocumentDB tự động lập chỉ mục mọi thuộc tính trong tài liệu ngay sau khi tài liệu được thêm vào cơ sở dữ liệu. Tuy nhiên, bạn có thể kiểm soát và tinh chỉnh chính sách lập chỉ mục của riêng mình để giảm chi phí lưu trữ và xử lý khi có các tài liệu và / hoặc thuộc tính cụ thể không bao giờ cần được lập chỉ mục.
Chính sách lập chỉ mục mặc định yêu cầu DocumentDB tự động lập chỉ mục mọi thuộc tính phù hợp với nhiều trường hợp phổ biến. Nhưng bạn cũng có thể triển khai chính sách tùy chỉnh thực hiện quyền kiểm soát tốt đối với chính xác những gì được lập chỉ mục và những gì không và chức năng khác liên quan đến lập chỉ mục.
DocumentDB hỗ trợ các kiểu lập chỉ mục sau:
- Hash
- Range
Băm
Chỉ mục băm cho phép truy vấn hiệu quả về bình đẳng, tức là trong khi tìm kiếm tài liệu trong đó một thuộc tính nhất định bằng một giá trị chính xác, thay vì khớp trên một phạm vi giá trị như nhỏ hơn, lớn hơn hoặc giữa.
Bạn có thể thực hiện các truy vấn phạm vi với chỉ mục băm, nhưng DocumentDB sẽ không thể sử dụng chỉ mục băm để tìm các tài liệu phù hợp và thay vào đó sẽ cần quét tuần tự từng tài liệu để xác định xem nó có nên được chọn bởi truy vấn phạm vi hay không.
Bạn sẽ không thể sắp xếp tài liệu của mình bằng mệnh đề ORDER BY trên thuộc tính chỉ có chỉ mục băm.
Phạm vi
Chỉ mục phạm vi được xác định cho thuộc tính, DocumentDB cho phép truy vấn hiệu quả các tài liệu dựa trên phạm vi giá trị. Nó cũng cho phép bạn sắp xếp các kết quả truy vấn trên thuộc tính đó, sử dụng ORDER BY.
DocumentDB cho phép bạn xác định cả chỉ số băm và chỉ mục phạm vi trên bất kỳ hoặc tất cả các thuộc tính, cho phép truy vấn bình đẳng và phạm vi hiệu quả, cũng như ORDER BY.
Chính sách lập chỉ mục
Mọi tập hợp đều có chính sách lập chỉ mục quy định loại chỉ mục nào được sử dụng cho các số và chuỗi trong mọi thuộc tính của mọi tài liệu.
Bạn cũng có thể kiểm soát việc tài liệu có được tự động lập chỉ mục khi chúng được thêm vào bộ sưu tập hay không.
Lập chỉ mục tự động được bật theo mặc định, nhưng bạn có thể ghi đè hành vi đó khi thêm tài liệu, yêu cầu DocumentDB không lập chỉ mục tài liệu cụ thể đó.
Bạn có thể tắt lập chỉ mục tự động để theo mặc định, tài liệu không được lập chỉ mục khi được thêm vào bộ sưu tập. Tương tự, bạn có thể ghi đè điều này ở cấp tài liệu và hướng dẫn DocumentDB lập chỉ mục một tài liệu cụ thể khi thêm nó vào bộ sưu tập. Đây được gọi là lập chỉ mục thủ công.
Bao gồm / Loại trừ Lập chỉ mục
Chính sách lập chỉ mục cũng có thể xác định đường dẫn hoặc đường dẫn nào nên được bao gồm hoặc loại trừ khỏi chỉ mục. Điều này hữu ích nếu bạn biết rằng có một số phần nhất định của tài liệu mà bạn không bao giờ truy vấn và một số phần nhất định mà bạn thực hiện.
Trong những trường hợp này, bạn có thể giảm chi phí lập chỉ mục bằng cách yêu cầu DocumentDB chỉ lập chỉ mục những phần cụ thể của mỗi tài liệu được thêm vào bộ sưu tập.
Lập chỉ mục tự động
Hãy xem một ví dụ đơn giản về lập chỉ mục tự động.
Step 1 - Đầu tiên, chúng tôi tạo một bộ sưu tập có tên là autoindexing và không cung cấp chính sách rõ ràng, bộ sưu tập này sử dụng chính sách lập chỉ mục mặc định, có nghĩa là tính năng lập chỉ mục tự động được bật trên bộ sưu tập này.
Ở đây chúng tôi đang sử dụng định tuyến dựa trên ID cho cơ sở dữ liệu tự liên kết nên chúng tôi không cần biết ID tài nguyên của nó hoặc truy vấn cho nó trước khi tạo bộ sưu tập. Chúng tôi chỉ có thể sử dụng ID cơ sở dữ liệu, đó là mydb.
Step 2 - Bây giờ chúng ta hãy tạo hai tài liệu, cả hai đều có họ là Upston.
private async static Task AutomaticIndexing(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Override Automatic Indexing ****");
// Create collection with automatic indexing
var collectionDefinition = new DocumentCollection {
Id = "autoindexing"
};
var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
collectionDefinition);
// Add a document (indexed)
dynamic indexedDocumentDefinition = new {
id = "MARK",
firstName = "Mark",
lastName = "Upston",
addressLine = "123 Main Street",
city = "Brooklyn",
state = "New York",
zip = "11229",
};
Document indexedDocument = await client
.CreateDocumentAsync("dbs/mydb/colls/autoindexing", indexedDocumentDefinition);
// Add another document (request no indexing)
dynamic unindexedDocumentDefinition = new {
id = "JANE",
firstName = "Jane",
lastName = "Upston",
addressLine = "123 Main Street",
city = "Brooklyn",
state = "New York",
zip = "11229",
};
Document unindexedDocument = await client
.CreateDocumentAsync("dbs/mydb/colls/autoindexing", unindexedDocumentDefinition,
new RequestOptions { IndexingDirective = IndexingDirective.Exclude });
//Unindexed document won't get returned when querying on non-ID (or selflink) property
var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing", "SELECT *
FROM c WHERE c.lastName = 'Doe'").ToList();
Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);
// Unindexed document will get returned when using no WHERE clause
var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
"SELECT * FROM c").ToList();
Console.WriteLine("All documents: {0}", allDocs.Count);
// Unindexed document will get returned when querying by ID (or self-link) property
Document janeDoc = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
"SELECT * FROM c WHERE c.id = 'JANE'").AsEnumerable().FirstOrDefault();
Console.WriteLine("Unindexed document self-link: {0}", janeDoc.SelfLink);
// Delete the collection
await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/autoindexing");
}
Cái đầu tiên này, đối với Mark Upston, được thêm vào bộ sưu tập và sau đó ngay lập tức được lập chỉ mục tự động dựa trên chính sách lập chỉ mục mặc định.
Nhưng khi tài liệu thứ hai cho Mark Upston được thêm vào, chúng tôi đã vượt qua các tùy chọn yêu cầu với IndexingDirective.Exclude hướng dẫn rõ ràng DocumentDB không lập chỉ mục tài liệu này, bất chấp chính sách lập chỉ mục của bộ sưu tập.
Chúng tôi có các loại truy vấn khác nhau cho cả hai tài liệu ở cuối.
Step 3 - Hãy gọi tác vụ AutomaticIndexing từ CreateDocumentClient.
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await AutomaticIndexing(client);
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** Override Automatic Indexing ****
Documents WHERE lastName = 'Upston': 1
All documents: 2
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oAOEkfQA=/docs/kV5oAOEkfQACA
AAAAAAAAA==/
Như bạn có thể thấy, chúng tôi có hai tài liệu như vậy, nhưng truy vấn chỉ trả về một tài liệu cho Mark vì tài liệu cho Mark không được lập chỉ mục. Nếu chúng ta truy vấn lại mà không có mệnh đề WHERE để truy xuất tất cả các tài liệu trong bộ sưu tập, thì chúng tôi sẽ nhận được một tập hợp kết quả với cả hai tài liệu và điều này là do các tài liệu chưa lập chỉ mục luôn được trả về bởi các truy vấn không có mệnh đề WHERE.
Chúng tôi cũng có thể truy xuất các tài liệu chưa lập chỉ mục bằng ID hoặc liên kết tự của chúng. Vì vậy, khi chúng tôi truy vấn tài liệu của Mark theo ID của anh ấy, MARK, chúng tôi thấy rằng DocumentDB trả về tài liệu mặc dù nó không được lập chỉ mục trong bộ sưu tập.
Lập chỉ mục thủ công
Hãy xem một ví dụ đơn giản về lập chỉ mục thủ công bằng cách ghi đè lập chỉ mục tự động.
Step 1- Đầu tiên, chúng tôi sẽ tạo một bộ sưu tập được gọi là lập chỉ mục thủ công và ghi đè chính sách mặc định bằng cách tắt lập chỉ mục tự động một cách rõ ràng. Điều này có nghĩa là, trừ khi chúng tôi yêu cầu khác, các tài liệu mới được thêm vào bộ sưu tập này sẽ không được lập chỉ mục.
private async static Task ManualIndexing(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Manual Indexing ****");
// Create collection with manual indexing
var collectionDefinition = new DocumentCollection {
Id = "manualindexing",
IndexingPolicy = new IndexingPolicy {
Automatic = false,
},
};
var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
collectionDefinition);
// Add a document (unindexed)
dynamic unindexedDocumentDefinition = new {
id = "MARK",
firstName = "Mark",
lastName = "Doe",
addressLine = "123 Main Street",
city = "Brooklyn",
state = "New York",
zip = "11229",
};
Document unindexedDocument = await client
.CreateDocumentAsync("dbs/mydb/colls/manualindexing", unindexedDocumentDefinition);
// Add another document (request indexing)
dynamic indexedDocumentDefinition = new {
id = "JANE",
firstName = "Jane",
lastName = "Doe",
addressLine = "123 Main Street",
city = "Brooklyn",
state = "New York",
zip = "11229",
};
Document indexedDocument = await client.CreateDocumentAsync
("dbs/mydb/colls/manualindexing", indexedDocumentDefinition, new RequestOptions {
IndexingDirective = IndexingDirective.Include });
//Unindexed document won't get returned when querying on non-ID (or selflink) property
var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
"SELECT * FROM c WHERE c.lastName = 'Doe'").ToList();
Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);
// Unindexed document will get returned when using no WHERE clause
var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
"SELECT * FROM c").ToList();
Console.WriteLine("All documents: {0}", allDocs.Count);
// Unindexed document will get returned when querying by ID (or self-link) property
Document markDoc = client
.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
"SELECT * FROM c WHERE c.id = 'MARK'")
.AsEnumerable().FirstOrDefault();
Console.WriteLine("Unindexed document self-link: {0}", markDoc.SelfLink);
await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/manualindexing");
}
Step 2- Bây giờ chúng ta sẽ tạo lại hai tài liệu giống như trước. Chúng tôi sẽ không cung cấp bất kỳ tùy chọn yêu cầu đặc biệt nào cho tài liệu của Mark lần này, vì chính sách lập chỉ mục của bộ sưu tập, tài liệu này sẽ không được lập chỉ mục.
Step 3 - Bây giờ khi chúng tôi thêm tài liệu thứ hai cho Mark, chúng tôi sử dụng RequestOptions với IndexingDirective.Include để nói với DocumentDB rằng nó nên lập chỉ mục tài liệu này, điều này sẽ ghi đè chính sách lập chỉ mục của bộ sưu tập nói rằng không nên.
Chúng tôi có các loại truy vấn khác nhau cho cả hai tài liệu ở cuối.
Step 4 - Hãy gọi tác vụ ManualIndexing từ CreateDocumentClient.
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await ManualIndexing(client);
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** Manual Indexing ****
Documents WHERE lastName = 'Upston': 1
All documents: 2
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oANHJPgE=/docs/kV5oANHJPgEBA
AAAAAAAAA==/
Một lần nữa, truy vấn chỉ trả về một trong hai tài liệu, nhưng lần này, nó trả về Jane Doe, mà chúng tôi đã yêu cầu lập chỉ mục một cách rõ ràng. Nhưng một lần nữa như trước, truy vấn mà không có mệnh đề WHERE sẽ truy xuất tất cả các tài liệu trong bộ sưu tập, bao gồm cả tài liệu chưa lập chỉ mục cho Mark. Chúng tôi cũng có thể truy vấn tài liệu chưa lập chỉ mục bằng ID của nó, DocumentDB trả về mặc dù nó không được lập chỉ mục.
Microsoft đã thêm geospatial support, cho phép bạn lưu trữ dữ liệu vị trí trong tài liệu của mình và thực hiện các phép tính không gian cho khoảng cách và giao điểm giữa các điểm và đa giác.
Dữ liệu không gian mô tả vị trí và hình dạng của các đối tượng trong không gian.
Thông thường, nó có thể được sử dụng để đại diện cho vị trí của một người, một địa điểm ưa thích hoặc ranh giới của một thành phố hoặc một cái hồ.
Các trường hợp sử dụng phổ biến thường liên quan đến các truy vấn lân cận. Ví dụ: "tìm tất cả các trường đại học gần vị trí hiện tại của tôi".
A Pointbiểu thị một vị trí duy nhất trong không gian đại diện cho vị trí chính xác, ví dụ: địa chỉ đường phố của trường đại học cụ thể. Một điểm được biểu diễn trong DocumentDB bằng cách sử dụng cặp tọa độ của nó (kinh độ và vĩ độ). Sau đây là một ví dụ về điểm JSON.
{
"type":"Point",
"coordinates":[ 28.3, -10.7 ]
}
Hãy xem một ví dụ đơn giản chứa vị trí của một trường đại học.
{
"id":"case-university",
"name":"CASE: Center For Advanced Studies In Engineering",
"city":"Islamabad",
"location": {
"type":"Point",
"coordinates":[ 33.7194136, -73.0964862 ]
}
}
Để lấy tên trường đại học dựa trên vị trí, bạn có thể sử dụng truy vấn sau.
SELECT c.name FROM c
WHERE c.id = "case-university" AND ST_ISVALID({
"type":"Point",
"coordinates":[ 33.7194136, -73.0964862 ]})
Khi truy vấn trên được thực thi, bạn sẽ nhận được kết quả sau.
[
{
"name": "CASE: Center For Advanced Studies In Engineering"
}
]
Tạo tài liệu với dữ liệu không gian địa lý trong .NET
Bạn có thể tạo một tài liệu với dữ liệu không gian địa lý, hãy xem một ví dụ đơn giản trong đó một tài liệu đại học được tạo.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
var uniDocument = new UniversityProfile {
Id = "nust",
Name = "National University of Sciences and Technology",
City = "Islamabad",
Loc = new Point(33.6455715, 72.9903447)
};
Document document = await CreateDocument(client, uniDocument);
Console.WriteLine("Created document {0} from typed object", document.Id);
Console.WriteLine();
}
Sau đây là cách triển khai cho lớp UniversityProfile.
public class UniversityProfile {
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("city")]
public string City { get; set; }
[JsonProperty("location")]
public Point Loc { get; set; }
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** Create Documents ****
Created new document: nust
{
"id": "nust",
"name": "National University of Sciences and Technology",
"city": "Islamabad",
"location": {
"type": "Point",
"coordinates": [
33.6455715,
72.9903447
]
},
"_rid": "Ic8LAMEUVgANAAAAAAAAAA==",
"_ts": 1450200910,
"_self": "dbs/Ic8LAA==/colls/Ic8LAMEUVgA=/docs/Ic8LAMEUVgANAAAAAAAAAA==/",
"_etag": "\"00004100-0000-0000-0000-56704f4e0000\"",
"_attachments": "attachments/"
}
Created document nust from typed object
Khi cơ sở dữ liệu của bạn bắt đầu phát triển vượt quá 10GB, bạn có thể mở rộng quy mô đơn giản bằng cách tạo các bộ sưu tập mới, sau đó rải hoặc phân vùng dữ liệu của mình trên nhiều bộ sưu tập hơn.
Không sớm thì muộn, một bộ sưu tập duy nhất, có dung lượng 10GB, sẽ không đủ để chứa cơ sở dữ liệu của bạn. Bây giờ 10GB nghe có vẻ không phải là một con số quá lớn, nhưng hãy nhớ rằng chúng tôi đang lưu trữ tài liệu JSON, chỉ là văn bản thuần túy và bạn có thể chứa nhiều tài liệu văn bản thuần túy trong 10GB, ngay cả khi bạn xem xét chi phí lưu trữ cho các chỉ mục.
Lưu trữ không phải là mối quan tâm duy nhất khi nói đến khả năng mở rộng. Thông lượng tối đa có sẵn trên một bộ sưu tập là 2,5 nghìn đơn vị yêu cầu mỗi giây mà bạn nhận được với một bộ sưu tập S3. Do đó, nếu bạn cần thông lượng cao hơn, thì bạn cũng sẽ cần phải mở rộng quy mô bằng cách phân vùng với nhiều bộ sưu tập. Phân vùng theo tỷ lệ còn được gọi làhorizontal partitioning.
Có nhiều cách tiếp cận có thể được sử dụng để phân vùng dữ liệu với Azure DocumentDB. Sau đây là các chiến lược phổ biến nhất -
- Phân vùng tràn
- Phân vùng phạm vi
- Phân vùng tra cứu
- Phân vùng băm
Phân vùng tràn
Phân vùng tràn là chiến lược đơn giản nhất vì không có khóa phân vùng. Nó thường là một lựa chọn tốt để bắt đầu khi bạn không chắc chắn về nhiều thứ. Bạn có thể không biết liệu bạn có bao giờ cần mở rộng quy mô ra ngoài một bộ sưu tập duy nhất hay không hoặc bạn có thể cần thêm bao nhiêu bộ sưu tập hoặc bạn có thể cần thêm chúng nhanh như thế nào.
Phân vùng tràn bắt đầu với một tập hợp duy nhất và không có khóa phân vùng.
Bộ sưu tập bắt đầu phát triển và sau đó phát triển thêm, và sau đó là một số nữa, cho đến khi bạn bắt đầu gần đạt đến giới hạn 10GB.
Khi bạn đạt đến 90% dung lượng, bạn chuyển sang một bộ sưu tập mới và bắt đầu sử dụng nó cho các tài liệu mới.
Khi cơ sở dữ liệu của bạn mở rộng ra một số lượng lớn hơn các bộ sưu tập, có thể bạn sẽ muốn chuyển sang chiến lược dựa trên khóa phân vùng.
Khi làm điều đó, bạn sẽ cần phải cân bằng lại dữ liệu của mình bằng cách di chuyển tài liệu sang các bộ sưu tập khác nhau dựa trên bất kỳ chiến lược nào bạn đang chuyển sang.
Phân vùng phạm vi
Một trong những chiến lược phổ biến nhất là phân vùng theo phạm vi. Với cách tiếp cận này, bạn xác định phạm vi giá trị mà khóa phân vùng của tài liệu có thể nằm trong đó và hướng tài liệu đến một tập hợp tương ứng với phạm vi đó.
Ngày thường được sử dụng với chiến lược này, trong đó bạn tạo một bộ sưu tập để lưu giữ các tài liệu nằm trong phạm vi ngày đã xác định. Khi bạn xác định phạm vi đủ nhỏ, nơi bạn tự tin rằng không có bộ sưu tập nào vượt quá giới hạn 10GB của nó. Ví dụ, có thể có một tình huống trong đó một bộ sưu tập duy nhất có thể xử lý hợp lý các tài liệu cho cả tháng.
Cũng có thể xảy ra trường hợp hầu hết người dùng đang truy vấn dữ liệu hiện tại, đó sẽ là dữ liệu của tháng này hoặc có thể là tháng trước, nhưng người dùng hiếm khi tìm kiếm dữ liệu cũ hơn nhiều. Vì vậy, bạn bắt đầu vào tháng 6 với bộ sưu tập S3, đây là bộ sưu tập đắt nhất mà bạn có thể mua và mang lại thông lượng tốt nhất mà bạn có thể nhận được.
Vào tháng 7, bạn mua một bộ sưu tập S3 khác để lưu trữ dữ liệu tháng 7 và bạn cũng chia tỷ lệ dữ liệu tháng 6 thành bộ sưu tập S2 rẻ hơn. Sau đó, vào tháng 8, bạn nhận được một bộ sưu tập S3 khác và chia tháng 7 xuống thành S2 và tháng 6 giảm dần xuống S1. Nó diễn ra, tháng này qua tháng khác, nơi bạn luôn giữ dữ liệu hiện tại có sẵn để có thông lượng cao và dữ liệu cũ hơn được giữ ở mức thông lượng thấp hơn.
Miễn là truy vấn cung cấp khóa phân vùng, chỉ bộ sưu tập cần được truy vấn mới được truy vấn và không phải tất cả các bộ sưu tập trong cơ sở dữ liệu như nó xảy ra với phân vùng tràn.
Phân vùng tra cứu
Với phân vùng tra cứu, bạn có thể xác định bản đồ phân vùng định tuyến tài liệu đến các bộ sưu tập cụ thể dựa trên khóa phân vùng của chúng. Ví dụ, bạn có thể phân vùng theo vùng.
Lưu trữ tất cả các tài liệu Hoa Kỳ trong một bộ sưu tập, tất cả các tài liệu châu Âu trong một bộ sưu tập khác và tất cả các tài liệu từ bất kỳ khu vực nào khác trong một bộ sưu tập thứ ba.
Sử dụng bản đồ phân vùng này và trình phân giải phân vùng tra cứu có thể tìm ra tập hợp nào để tạo tài liệu và tập hợp nào cần truy vấn, dựa trên khóa phân vùng, là thuộc tính vùng có trong mỗi tài liệu.
Phân vùng băm
Trong phân vùng băm, các phân vùng được gán dựa trên giá trị của một hàm băm, cho phép bạn phân phối đồng đều các yêu cầu và dữ liệu trên một số phân vùng.
Điều này thường được sử dụng để phân vùng dữ liệu được tạo ra hoặc tiêu thụ từ một số lượng lớn các máy khách riêng biệt và hữu ích để lưu trữ hồ sơ người dùng, các mục danh mục, v.v.
Hãy xem một ví dụ đơn giản về phân vùng phạm vi bằng cách sử dụng RangePartitionResolver do .NET SDK cung cấp.
Step 1- Tạo một DocumentClient mới và chúng tôi sẽ tạo hai bộ sưu tập trong tác vụ CreateCollections. Một sẽ chứa các tài liệu dành cho người dùng có ID người dùng bắt đầu từ A đến M và tài liệu còn lại chứa các ID người dùng từ N đến Z.
private static async Task CreateCollections(DocumentClient client) {
await client.CreateDocumentCollectionAsync(“dbs/myfirstdb”, new DocumentCollection {
Id = “CollectionAM” });
await client.CreateDocumentCollectionAsync(“dbs/myfirstdb”, new DocumentCollection {
Id = “CollectionNZ” });
}
Step 2 - Đăng ký trình phân giải phạm vi cho cơ sở dữ liệu.
Step 3- Tạo một RangePartitionResolver <string> mới, là kiểu dữ liệu của khóa phân vùng của chúng ta. Hàm tạo nhận hai tham số, tên thuộc tính của khóa phân vùng và từ điển là bản đồ phân đoạn hoặc bản đồ phân vùng, chỉ là danh sách các phạm vi và tập hợp tương ứng mà chúng ta đang xác định trước cho trình phân giải.
private static void RegisterRangeResolver(DocumentClient client) {
//Note: \uffff is the largest UTF8 value, so M\ufff includes all strings that start with M.
var resolver = new RangePartitionResolver<string>(
"userId", new Dictionary<Range<string>, string>() {
{ new Range<string>("A", "M\uffff"), "dbs/myfirstdb/colls/CollectionAM" },
{ new Range<string>("N", "Z\uffff"), "dbs/myfirstdb/colls/CollectionNZ" },
});
client.PartitionResolvers["dbs/myfirstdb"] = resolver;
}
Cần mã hóa giá trị UTF-8 lớn nhất có thể ở đây. Hoặc nếu không thì phạm vi đầu tiên sẽ không khớp với bất kỳ Ms nào ngoại trừ một M duy nhất, và tương tự đối với Z trong phạm vi thứ hai. Vì vậy, bạn có thể nghĩ về giá trị được mã hóa này ở đây như một ký tự đại diện để khớp trên khóa phân vùng.
Step 4- Sau khi tạo trình phân giải, hãy đăng ký nó cho cơ sở dữ liệu với DocumentClient hiện tại. Để làm điều đó, chỉ cần gán nó vào thuộc tính từ điển của PartitionResolver.
Chúng tôi sẽ tạo và truy vấn các tài liệu dựa trên cơ sở dữ liệu, không phải một bộ sưu tập như bạn thường làm, trình phân giải sẽ sử dụng bản đồ này để định tuyến các yêu cầu đến các bộ sưu tập thích hợp.
Bây giờ chúng ta hãy tạo một số tài liệu. Đầu tiên, chúng tôi sẽ tạo một cho userId Kirk, và sau đó một cho Spock.
private static async Task CreateDocumentsAcrossPartitions(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents Across Partitions ****");
var kirkDocument = await client.CreateDocumentAsync("dbs/myfirstdb", new { userId =
"Kirk", title = "Captain" });
Console.WriteLine("Document 1: {0}", kirkDocument.Resource.SelfLink);
var spockDocument = await client.CreateDocumentAsync("dbs/myfirstdb", new { userId =
"Spock", title = "Science Officer" });
Console.WriteLine("Document 2: {0}", spockDocument.Resource.SelfLink);
}
Tham số đầu tiên ở đây là một liên kết tự đến cơ sở dữ liệu, không phải là một tập hợp cụ thể. Điều này không thể thực hiện được nếu không có trình phân giải phân vùng, nhưng với trình giải quyết phân vùng, nó hoạt động liền mạch.
Cả hai tài liệu đã được lưu vào cơ sở dữ liệu myfirstdb, nhưng chúng tôi biết rằng Kirk đang được lưu trữ trong bộ sưu tập từ A đến M và Spock đang được lưu trữ trong bộ sưu tập từ N đến Z, nếu RangePartitionResolver của chúng tôi hoạt động bình thường.
Hãy gọi chúng từ tác vụ CreateDocumentClient như được hiển thị trong đoạn mã sau.
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await CreateCollections(client);
RegisterRangeResolver(client);
await CreateDocumentsAcrossPartitions(client);
}
}
Khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau.
**** Create Documents Across Partitions ****
Document 1: dbs/Ic8LAA==/colls/Ic8LAO2DxAA=/docs/Ic8LAO2DxAABAAAAAAAAAA==/
Document 2: dbs/Ic8LAA==/colls/Ic8LAP12QAE=/docs/Ic8LAP12QAEBAAAAAAAAAA==/
Như đã thấy, các liên kết tự của hai tài liệu có ID tài nguyên khác nhau vì chúng tồn tại trong hai tập hợp riêng biệt.
Với công cụ Di chuyển dữ liệu DocumentDB, bạn có thể dễ dàng di chuyển dữ liệu sang DocumentDB. Công cụ Di chuyển Dữ liệu DocumentDB là một tiện ích mã nguồn mở và miễn phí mà bạn có thể tải xuống từ Trung tâm Tải xuống của Microsofthttps://www.microsoft.com/
Công cụ di chuyển hỗ trợ nhiều nguồn dữ liệu, một số trong số chúng được liệt kê bên dưới -
- Máy chủ SQL
- Tệp JSON
- Tệp phẳng về Giá trị được phân tách bằng dấu phẩy (CSV)
- MongoDB
- Lưu trữ bảng Azure
- Amazon DynamoDB
- HBase và thậm chí các cơ sở dữ liệu DocumentDB khác
Sau khi tải xuống công cụ Di chuyển dữ liệu DocumentDB, hãy giải nén tệp zip.
Bạn có thể thấy hai tệp thực thi trong thư mục này như được hiển thị trong ảnh chụp màn hình sau.
Đầu tiên, có dt.exe, là phiên bản console với giao diện dòng lệnh, sau đó là dtui.exe, là phiên bản dành cho máy tính để bàn có giao diện người dùng đồ họa.
Hãy khởi chạy phiên bản GUI.
Bạn có thể xem trang Chào mừng. Nhấp vào 'Tiếp theo' cho trang Thông tin Nguồn.
Đây là nơi bạn định cấu hình nguồn dữ liệu của mình và bạn có thể thấy nhiều lựa chọn được hỗ trợ từ menu thả xuống.
Khi bạn thực hiện lựa chọn, phần còn lại của trang Thông tin nguồn sẽ thay đổi theo.
Rất dễ dàng để nhập dữ liệu vào DocumentDB bằng Công cụ di chuyển dữ liệu DocumentDB. Chúng tôi khuyên bạn nên thực hiện các ví dụ trên và sử dụng các tệp dữ liệu khác.
DocumentDB cung cấp các khái niệm để kiểm soát quyền truy cập vào tài nguyên DocumentDB. Quyền truy cập vào tài nguyên DocumentDB được điều chỉnh bởi mã thông báo khóa chính hoặc mã thông báo tài nguyên. Các kết nối dựa trên mã thông báo tài nguyên chỉ có thể truy cập các tài nguyên được chỉ định bởi mã thông báo và không có tài nguyên nào khác. Mã thông báo tài nguyên dựa trên quyền của người dùng.
Đầu tiên, bạn tạo một hoặc nhiều người dùng và những người dùng này được xác định ở cấp cơ sở dữ liệu.
Sau đó, bạn tạo một hoặc nhiều quyền cho mỗi người dùng, dựa trên tài nguyên mà bạn muốn cho phép mỗi người dùng truy cập.
Mỗi quyền tạo ra một mã thông báo tài nguyên cho phép truy cập chỉ đọc hoặc toàn quyền vào một tài nguyên nhất định và đó có thể là bất kỳ tài nguyên người dùng nào trong cơ sở dữ liệu.
Người dùng được xác định ở cấp cơ sở dữ liệu và quyền được xác định cho từng người dùng.
Người dùng và quyền áp dụng cho tất cả các bộ sưu tập trong cơ sở dữ liệu.
Hãy xem một ví dụ đơn giản, trong đó chúng ta sẽ tìm hiểu cách xác định người dùng và quyền để đạt được bảo mật chi tiết trong DocumentDB.
Chúng ta sẽ bắt đầu với một DocumentClient mới và truy vấn cho cơ sở dữ liệu myfirstdb.
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();
var alice = await CreateUser(client, "Alice");
var tom = await CreateUser(client, "Tom");
}
}
Sau đây là cách thực hiện cho CreateUser.
private async static Task<User> CreateUser(DocumentClient client, string userId) {
Console.WriteLine();
Console.WriteLine("**** Create User {0} in {1} ****", userId, database.Id);
var userDefinition = new User { Id = userId };
var result = await client.CreateUserAsync(database.SelfLink, userDefinition);
var user = result.Resource;
Console.WriteLine("Created new user");
ViewUser(user);
return user;
}
Step 1- Tạo hai người dùng, Alice và Tom giống như bất kỳ tài nguyên nào chúng tôi tạo, chúng tôi xây dựng một đối tượng định nghĩa với Id mong muốn và gọi phương thức tạo và trong trường hợp này, chúng tôi gọi CreateUserAsync với SelfLink của cơ sở dữ liệu và userDefinition. Chúng tôi lấy lại kết quả từ thuộc tính tài nguyên mà chúng tôi có được đối tượng người dùng mới được tạo.
Bây giờ để xem hai người dùng mới này trong cơ sở dữ liệu.
private static void ViewUsers(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** View Users in {0} ****", database.Id);
var users = client.CreateUserQuery(database.UsersLink).ToList();
var i = 0;
foreach (var user in users) {
i++;
Console.WriteLine();
Console.WriteLine("User #{0}", i);
ViewUser(user);
}
Console.WriteLine();
Console.WriteLine("Total users in database {0}: {1}", database.Id, users.Count);
}
private static void ViewUser(User user) {
Console.WriteLine("User ID: {0} ", user.Id);
Console.WriteLine("Resource ID: {0} ", user.ResourceId);
Console.WriteLine("Self Link: {0} ", user.SelfLink);
Console.WriteLine("Permissions Link: {0} ", user.PermissionsLink);
Console.WriteLine("Timestamp: {0} ", user.Timestamp);
}
Step 2- Gọi CreateUserQuery, chống lại UsersLink của cơ sở dữ liệu để lấy danh sách tất cả người dùng. Sau đó lặp qua chúng và xem thuộc tính của chúng.
Bây giờ chúng ta phải tạo chúng trước. Vì vậy, giả sử chúng tôi muốn cho phép Alice quyền đọc / ghi vào bộ sưu tập MyCollection, nhưng Tom chỉ có thể đọc tài liệu trong bộ sưu tập.
await CreatePermission(client, alice, "Alice Collection Access", PermissionMode.All,
collection);
await CreatePermission(client, tom, "Tom Collection Access", PermissionMode.Read,
collection);
Step 3- Tạo quyền trên một tài nguyên là bộ sưu tập MyCollection nên chúng ta cần lấy tài nguyên đó một Liên kết tự.
Step 4 - Sau đó, tạo Permission.All trên bộ sưu tập này cho Alice và một Permission.Đọc trên bộ sưu tập này cho Tom.
Sau đây là cách thực hiện cho CreatePermission.
private async static Task CreatePermission(DocumentClient client, User user,
string permId, PermissionMode permissionMode, string resourceLink) {
Console.WriteLine();
Console.WriteLine("**** Create Permission {0} for {1} ****", permId, user.Id);
var permDefinition = new Permission {
Id = permId,
PermissionMode = permissionMode,
ResourceLink = resourceLink
};
var result = await client.CreatePermissionAsync(user.SelfLink, permDefinition);
var perm = result.Resource;
Console.WriteLine("Created new permission");
ViewPermission(perm);
}
Như bạn có thể mong đợi ngay bây giờ, chúng tôi thực hiện điều này bằng cách tạo một đối tượng định nghĩa cho quyền mới, bao gồm Id và LicenseMode, là Permission.All hoặc Permission.Read và SelfLink của tài nguyên đang được bảo mật bởi sự cho phép.
Step 5 - Gọi CreatePermissionAsync và nhận quyền đã tạo từ thuộc tính tài nguyên trong kết quả.
Để xem quyền đã tạo, sau đây là cách triển khai các Quyền của View.
private static void ViewPermissions(DocumentClient client, User user) {
Console.WriteLine();
Console.WriteLine("**** View Permissions for {0} ****", user.Id);
var perms = client.CreatePermissionQuery(user.PermissionsLink).ToList();
var i = 0;
foreach (var perm in perms) {
i++;
Console.WriteLine();
Console.WriteLine("Permission #{0}", i);
ViewPermission(perm);
}
Console.WriteLine();
Console.WriteLine("Total permissions for {0}: {1}", user.Id, perms.Count);
}
private static void ViewPermission(Permission perm) {
Console.WriteLine("Permission ID: {0} ", perm.Id);
Console.WriteLine("Resource ID: {0} ", perm.ResourceId);
Console.WriteLine("Permission Mode: {0} ", perm.PermissionMode);
Console.WriteLine("Token: {0} ", perm.Token);
Console.WriteLine("Timestamp: {0} ", perm.Timestamp);
}
Lần này, đó là một truy vấn quyền đối với liên kết quyền của người dùng và chúng tôi chỉ cần liệt kê từng quyền được trả lại cho người dùng.
Hãy xóa quyền của Alice và Tom.
await DeletePermission(client, alice, "Alice Collection Access");
await DeletePermission(client, tom, "Tom Collection Access");
Sau đây là cách thực hiện cho DeletePermission.
private async static Task DeletePermission(DocumentClient client, User user,
string permId) {
Console.WriteLine();
Console.WriteLine("**** Delete Permission {0} from {1} ****", permId, user.Id);
var query = new SqlQuerySpec {
QueryText = "SELECT * FROM c WHERE c.id = @id",
Parameters = new SqlParameterCollection {
new SqlParameter { Name = "@id", Value = permId }
}
};
Permission perm = client.CreatePermissionQuery(user.PermissionsLink, query)
.AsEnumerable().First();
await client.DeletePermissionAsync(perm.SelfLink);
Console.WriteLine("Deleted permission {0} from user {1}", permId, user.Id);
}
Step 6 - Để xóa quyền, hãy truy vấn theo Id quyền để lấy SelfLink, sau đó sử dụng SelfLink để xóa quyền.
Tiếp theo, hãy xóa chính người dùng. Hãy xóa cả hai người dùng.
await DeleteUser(client, "Alice");
await DeleteUser(client, "Tom");
Sau đây là cách thực hiện cho DeleteUser.
private async static Task DeleteUser(DocumentClient client, string userId) {
Console.WriteLine();
Console.WriteLine("**** Delete User {0} in {1} ****", userId, database.Id);
var query = new SqlQuerySpec {
QueryText = "SELECT * FROM c WHERE c.id = @id",
Parameters = new SqlParameterCollection {
new SqlParameter { Name = "@id", Value = userId }
}
};
User user = client.CreateUserQuery(database.SelfLink, query).AsEnumerable().First();
await client.DeleteUserAsync(user.SelfLink);
Console.WriteLine("Deleted user {0} from database {1}", userId, database.Id);
}
Step 7 - Truy vấn đầu tiên để có được SelfLink của cô ấy và sau đó gọi DeleteUserAsync để xóa đối tượng người dùng của cô ấy.
Sau đây là việc thực hiện tác vụ CreateDocumentClient mà chúng tôi gọi là tất cả các tác vụ ở trên.
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();
ViewUsers(client);
var alice = await CreateUser(client, "Alice");
var tom = await CreateUser(client, "Tom");
ViewUsers(client);
ViewPermissions(client, alice);
ViewPermissions(client, tom);
string collectionLink = client.CreateDocumentCollectionQuery(database.SelfLink,
"SELECT VALUE c._self FROM c WHERE c.id = 'MyCollection'")
.AsEnumerable().First().Value;
await CreatePermission(client, alice, "Alice Collection Access", PermissionMode.All,
collectionLink);
await CreatePermission(client, tom, "Tom Collection Access", PermissionMode.Read,
collectionLink);
ViewPermissions(client, alice);
ViewPermissions(client, tom);
await DeletePermission(client, alice, "Alice Collection Access");
await DeletePermission(client, tom, "Tom Collection Access");
await DeleteUser(client, "Alice");
await DeleteUser(client, "Tom");
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
**** View Users in myfirstdb ****
Total users in database myfirstdb: 0
**** Create User Alice in myfirstdb ****
Created new user
User ID: Alice
Resource ID: kV5oAC56NwA=
Self Link: dbs/kV5oAA==/users/kV5oAC56NwA=/
Permissions Link: dbs/kV5oAA==/users/kV5oAC56NwA=/permissions/
Timestamp: 12/17/2015 5:44:19 PM
**** Create User Tom in myfirstdb ****
Created new user
User ID: Tom
Resource ID: kV5oAALxKgA=
Self Link: dbs/kV5oAA==/users/kV5oAALxKgA=/
Permissions Link: dbs/kV5oAA==/users/kV5oAALxKgA=/permissions/
Timestamp: 12/17/2015 5:44:21 PM
**** View Users in myfirstdb ****
User #1
User ID: Tom
Resource ID: kV5oAALxKgA=
Self Link: dbs/kV5oAA==/users/kV5oAALxKgA=/
Permissions Link: dbs/kV5oAA==/users/kV5oAALxKgA=/permissions/
Timestamp: 12/17/2015 5:44:21 PM
User #2
User ID: Alice
Resource ID: kV5oAC56NwA=
Self Link: dbs/kV5oAA==/users/kV5oAC56NwA=/
Permissions Link: dbs/kV5oAA==/users/kV5oAC56NwA=/permissions/
Timestamp: 12/17/2015 5:44:19 PM
Total users in database myfirstdb: 2
**** View Permissions for Alice ****
Total permissions for Alice: 0
**** View Permissions for Tom ****
Total permissions for Tom: 0
**** Create Permission Alice Collection Access for Alice ****
Created new permission
Permission ID: Alice Collection Access
Resource ID: kV5oAC56NwDON1RduEoCAA==
Permission Mode: All
Token: type=resource&ver=1&sig=zB6hfvvleC0oGGbq5cc67w==;Zt3Lx
Ol14h8pd6/tyF1h62zbZKk9VwEIATIldw4ZyipQGW951kirueAKdeb3MxzQ7eCvDfvp7Y/ZxFpnip/D G
JYcPyim5cf+dgLvos6fUuiKSFSul7uEKqp5JmJqUCyAvD7w+qt1Qr1PmrJDyAIgbZDBFWGe2VT9FaBH o
PYwrLjRlnH0AxfbrR+T/UpWMSSHtLB8JvNFZNSH8hRjmQupuTSxCTYEC89bZ/pS6fNmNg8=;
Timestamp: 12/17/2015 5:44:28 PM
**** Create Permission Tom Collection Access for Tom ****
Created new permission
Permission ID: Tom Collection Access
Resource ID: kV5oAALxKgCMai3JKWdfAA==
Permission Mode: Read
Token: type=resource&ver=1&sig=ieBHKeyi6EY9ZOovDpe76w==;92gwq
V4AxKaCJ2dLS02VnJiig/5AEbPcfo1xvOjR10uK3a3FUMFULgsaK8nzxdz6hLVCIKUj6hvMOTOSN8Lt 7
i30mVqzpzCfe7JO3TYSJEI9D0/5HbMIEgaNJiCu0JPPwsjVecTytiLN56FHPguoQZ7WmUAhVTA0IMP6 p
jQpLDgJ43ZaG4Zv3qWJiO689balD+egwiU2b7RICH4j6R66UVye+GPxq/gjzqbHwx79t54=;
Timestamp: 12/17/2015 5:44:30 PM
**** View Permissions for Alice ****
Permission #1
Permission ID: Alice Collection Access
Resource ID: kV5oAC56NwDON1RduEoCAA==
Permission Mode: All
Token: type=resource&ver=1&sig=BSzz/VNe9j4IPJ9M31Mf4Q==;Tcq/B
X50njB1vmANZ/4aHj/3xNkghaqh1OfV95JMi6j4v7fkU+gyWe3mJasO3MJcoop9ixmVnB+RKOhFaSxE l
P37SaGuIIik7GAWS+dcEBWglMefc95L2YkeNuZsjmmW5b+a8ELCUg7N45MKbpzkp5BrmmGVJ7h4Z4pf D
rdmehYLuxSPLkr9ndbOOrD8E3bux6TgXCsgYQscpIlJHSKCKHUHfXWBP2Y1LV2zpJmRjis=;
Timestamp: 12/17/2015 5:44:28 PM
Total permissions for Alice: 1
**** View Permissions for Tom ****
Permission #1
Permission ID: Tom Collection Access
Resource ID: kV5oAALxKgCMai3JKWdfAA==
Permission Mode: Read
Token: type=resource&ver=1&sig=NPkWNJp1mAkCASE8KdR6PA==;ur/G2
V+fDamBmzECux000VnF5i28f8WRbPwEPxD1DMpFPqYcu45wlDyzT5A5gBr3/R3qqYkEVn8bU+een6Gl j
L6vXzIwsZfL12u/1hW4mJT2as2PWH3eadry6Q/zRXHAxV8m+YuxSzlZPjBFyJ4Oi30mrTXbBAEafZhA 5
yvbHkpLmQkLCERy40FbIFOzG87ypljREpwWTKC/z8RSrsjITjAlfD/hVDoOyNJwX3HRaz4=;
Timestamp: 12/17/2015 5:44:30 PM
Total permissions for Tom: 1
**** Delete Permission Alice Collection Access from Alice ****
Deleted permission Alice Collection Access from user Alice
**** Delete Permission Tom Collection Access from Tom ****
Deleted permission Tom Collection Access from user Tom
**** Delete User Alice in myfirstdb ****
Deleted user Alice from database myfirstdb
**** Delete User Tom in myfirstdb ****
Deleted user Tom from database myfirstdb
Trong chương này, chúng ta sẽ học cách trực quan hóa dữ liệu được lưu trữ trong DocumentDB. Microsoft đã cung cấp công cụ Power BI Desktop giúp chuyển đổi dữ liệu của bạn thành hình ảnh phong phú. Nó cũng cho phép bạn truy xuất dữ liệu từ nhiều nguồn dữ liệu khác nhau, hợp nhất và chuyển đổi dữ liệu, tạo báo cáo và hình ảnh hóa mạnh mẽ, đồng thời xuất bản báo cáo lên Power BI.
Trong phiên bản Power BI Desktop mới nhất, Microsoft đã thêm hỗ trợ cho DocumentDB cũng như trong đó bạn hiện có thể kết nối với tài khoản DocumentDB của mình. Bạn có thể tải xuống công cụ này từ liên kết,https://powerbi.microsoft.com
Hãy xem một ví dụ mà chúng ta sẽ hình dung dữ liệu động đất được nhập trong chương trước.
Step 1 - Sau khi công cụ được tải xuống, hãy khởi chạy màn hình nền Power BI.
Step 2 - Nhấp vào tùy chọn 'Lấy Dữ liệu' trên tab Trang chủ trong nhóm Dữ liệu Bên ngoài và nó sẽ hiển thị trang Lấy Dữ liệu.
Step 3 - Chọn tùy chọn Microsoft Azure DocumentDB (Beta) và nhấp vào nút 'Kết nối'.
Step 4 - Nhập URL của tài khoản Azure DocumentDB, Cơ sở dữ liệu và Bộ sưu tập mà bạn muốn trực quan hóa dữ liệu và nhấn Ok.
Nếu bạn đang kết nối với điểm cuối này lần đầu tiên, bạn sẽ được nhắc nhập khóa tài khoản.
Step 5 - Nhập khóa tài khoản (khóa chính) duy nhất cho mỗi tài khoản DocumentDB có sẵn trên cổng Azure, sau đó nhấp vào Kết nối.
Khi tài khoản được kết nối thành công, nó sẽ lấy dữ liệu từ cơ sở dữ liệu được chỉ định. Ngăn Xem trước hiển thị danh sách các mục Bản ghi, một Tài liệu được biểu diễn dưới dạng một loại Bản ghi trong Power BI.
Step 6 - Nhấp vào nút 'Chỉnh sửa' sẽ khởi chạy Trình chỉnh sửa truy vấn.
Step 7 - Trong Power BI Query Editor, bạn sẽ thấy cột Tài liệu trong ngăn trung tâm, hãy nhấp vào trình mở rộng ở bên phải của tiêu đề cột Tài liệu và chọn cột bạn muốn hiển thị.
Như bạn có thể thấy rằng chúng tôi có vĩ độ và kinh độ là cột riêng biệt nhưng chúng tôi trực quan hóa dữ liệu ở dạng tọa độ vĩ độ, kinh độ.
Step 8 - Để làm điều đó, hãy nhấp vào tab 'Thêm cột'.
Step 9 - Chọn Thêm cột tùy chỉnh sẽ hiển thị trang sau.
Step 10- Chỉ định tên cột mới, giả sử LatLong và cũng là công thức sẽ kết hợp vĩ độ và kinh độ trong một cột được phân tách bằng dấu phẩy. Sau đây là công thức.
Text.From([latitude])&", "&Text.From([longitude])
Step 11 - Nhấn OK để tiếp tục và bạn sẽ thấy cột mới được thêm vào.
Step 12 - Chuyển đến tab Trang chủ và nhấp vào tùy chọn 'Đóng & Áp dụng'.
Step 13- Bạn có thể tạo báo cáo bằng cách kéo và thả các trường vào canvas Báo cáo. Bạn có thể thấy ở bên phải, có hai ngăn - một ngăn Hình ảnh hóa và ngăn kia là ngăn Trường.
Hãy tạo chế độ xem bản đồ hiển thị vị trí của từng trận động đất.
Step 14 - Kéo kiểu trực quan bản đồ từ ngăn Hình ảnh hóa.
Step 15- Bây giờ, kéo và thả trường LatLong từ ngăn Trường vào thuộc tính Vị trí trong ngăn Hình ảnh hóa. Sau đó, kéo và thả trường độ lớn vào thuộc tính Giá trị.
Step 16 - Kéo và thả trường độ sâu vào thuộc tính Color saturation.
Bây giờ bạn sẽ thấy hình ảnh Bản đồ hiển thị một tập hợp các bong bóng cho biết vị trí của từng trận động đất.