Microsoft недавно представила новый продукт под названием DocumentDB как часть служб Azure, который представляет собой хранилище данных NoSQL, и я считаю, что это очень хороший шаг и в очень хорошее время!

Раньше было еще одно хранилище без схемы (отчасти потому, что каждая строка в таблице может иметь свою собственную структуру!) под названием хранилище таблиц Azure, но оно больше похоже на хранилище пар ключ/значение, а не на идеальное хранилище документов, где вы можете хранить JSON, поэтому, если вы хотите получить доступ к строкам с помощью ключа и у вас есть простая структура, очень быстро и эффективно использовать хранилище таблиц Azure, кроме этого вам лучше поискать другое хранилище данных.

Я думаю, что DocumentDB будет конкурировать с MongoDB или некоторыми другими хранилищами документов, и на данный момент Microsoft не планирует выпускать локальную версию этого продукта, и если вы хотите ее использовать вам нужно получить подписку Azure, что может быть большим недостатком!

В любом случае, вы можете начать с входа на новый портал Azure здесь: https://portal.azure.com

Как вы можете видеть на рисунке ниже, когда вы нажимаете в левом нижнем углу знак + (Создать), затем нажимаете категорию «Данные + хранилище», и вот оно: БД документов.

«Id» должен быть только в нижнем регистре! не знаю почему! может быть, они размещают это на Linux?! В любом случае, так оно и есть (этот лазурный портал все еще находится в предварительной версии, поэтому он может быть исправлен позже)

Прямо сейчас создание DocumentDB занимает очень много времени! опять же, может быть, потому что это в предварительном просмотре! Я просто сравниваю это со временем, которое потребуется в Microsoft SQL Server Management Studio для создания базы данных, и это действительно занимает более 10 минут. (Там даже есть сообщение о том, что для завершения создания базы данных потребуется около 10 минут)

После создания базы данных вы сразу перейдете на только что созданную страницу DocumentDB, и если вы закроете браузер, вы сможете вернуться туда со стартовой страницы портала Azure (рисунок ниже).

На панели инструментов DocumentDB есть некоторая информация, и самая важная часть, которая вам понадобится для подключения и взаимодействия с вашей DocumentDB из вашего приложения, находится в меню KEYS.

Все, что вам нужно для подключения к вашей БД, — это URI и первичный ключ, который в основном является вашей строкой подключения, которая у нас есть в мире Entity Framework и SQL Server.

Если вы нажмете на ссылку БЫСТРЫЙ СТАРТ, вы увидите несколько полезных ссылок и руководств по работе с DocumentDB и различными адаптерами, доступными для разных языков программирования.

Теперь давайте перейдем к коду и начнем создавать там сущности.

Я создам простую библиотеку классов и тестовый проект для выполнения некоторых основных операций CRUD с DocumentDB:

Сначала вам нужно установить пакет nuget Microsoft Azure Document Client в ваших проектах, который вы можете получить по этому адресу: http://www.nuget.org/packages/Microsoft.Azure.Documents.Client/

Обратите внимание, что на данный момент он находится в состоянии предварительного выпуска, поэтому, когда вы хотите загрузить пакет, убедитесь, что вы ищете его с помощью команды –pre, чтобы ваш менеджер пакетов мог его найти.

Вот мой класс поставщика DocumentDb для выполнения некоторых операций:

public class DocumentDBProvider
{
private static string EndpointUrl ="Get this from the KEYS section in DocumentDB dashboard in Azure portal, use the URI property";
private static string AuthorizationKey ="Get this from the KEYS section in DocumentDB dashboard in Azure portal, use the PRIMARY KEY property";
private static string DatabaseName ="InterviewDB";
private static string DocumentCollectionName ="InterviewCollection";
public async Task<DocumentCollection> CreateDatabaseAndDocumentCollection()
{
var client =new DocumentClient(new Uri(EndpointUrl), AuthorizationKey);
Database database = await client.CreateDatabaseAsync(new Database { Id = DatabaseName });
DocumentCollection documentCollection = await client.CreateDocumentCollectionAsync(database.CollectionsLink,
new DocumentCollection { Id = DocumentCollectionName }
);
return documentCollection;
}
public async Task<ResourceResponse<Document>> AddCanidateToCollection(Candidate candidate)
{
var client =new DocumentClient(new Uri(EndpointUrl), AuthorizationKey);
Database database = client.CreateDatabaseQuery().Where(db => db.Id == DatabaseName).AsEnumerable().FirstOrDefault();
DocumentCollection documentCollection = client.CreateDocumentCollectionQuery(database.CollectionsLink).Where(db => db.Id == DocumentCollectionName).AsEnumerable().FirstOrDefault();
return await client.CreateDocumentAsync(documentCollection.DocumentsLink, candidate);
}
public List<Candidate> GetCandidatesCollection()
{
var client =new DocumentClient(new Uri(EndpointUrl), AuthorizationKey);
Database database = client.CreateDatabaseQuery().Where(db => db.Id == DatabaseName).AsEnumerable().FirstOrDefault();
DocumentCollection documentCollection = client.CreateDocumentCollectionQuery(database.CollectionsLink).Where(db => db.Id == DocumentCollectionName).AsEnumerable().FirstOrDefault();
return client.CreateDocumentQuery<Candidate>(documentCollection.DocumentsLink).ToList();
}
public List<Candidate> GetCandidateById(int candidateId)
{
var client =new DocumentClient(new Uri(EndpointUrl), AuthorizationKey);
Database database = client.CreateDatabaseQuery().Where(db => db.Id == DatabaseName).AsEnumerable().FirstOrDefault();
DocumentCollection documentCollection = client.CreateDocumentCollectionQuery(database.CollectionsLink).Where(db => db.Id == DocumentCollectionName).AsEnumerable().FirstOrDefault();
return client.CreateDocumentQuery<Candidate>(documentCollection.DocumentsLink).Where(m => m.CandidateId == candidateId).Select(m => m).ToList();
}
}

Как видите, в этом классе 4 члена,

  1. CreateDatabaseAndDocumentCollection: предназначен для создания базы данных, а один — для объекта DocumentCollection (объект DocumentCollection — это то, что мы используем, чтобы знать их как таблицы в мире проектирования реляционных баз данных, но они не совсем похожи на таблицы, если вы обратитесь к дизайну хранилищ NoSQL, потому что они похожи на автономные объекты в вашем приложении)
  2. AddCanidateToCollection: метод, добавляющий документы в DocumentCollection. в этом примере он добавляет заполненный класс POCO с именем Candidate в коллекцию DocumentCollection.
  3. GetCandidatesCollection: этот метод возвращает все документы внутри DocumentCollection, в которую мы добавили объекты, без каких-либо условий.
  4. GetCandidateById: этот метод запрашивает DocumentCollection и ищет там все документы, соответствующие переданному в CandidateId.

Теперь я добавляю 4 метода тестирования для проверки этих методов:

[TestClass]
public class DocumentDBTest
{
[TestMethod]
public async Task CreateDatabaseAndDocumentCollection_Test()
{
var sut =new DocumentDBDemo.DocumentDBProvider();
var result = await sut.CreateDatabaseAndDocumentCollection();
Assert.IsNotNull(result);
}
[TestMethod]
public async Task AddCanidateToCollection_Test()
{
var sut =new DocumentDBDemo.DocumentDBProvider();
var candidate =new Candidate()
{
CandidateFirstName ="Aram",
CandidateLastName ="Koukia",
CandidateId = 1,
Status =new CandidateStatus() {
CandidateStatusId= 1,
CandidateStatusName ="New"
}
};
var result = await sut.AddCanidateToCollection(candidate);
Assert.IsNotNull(result);
}
[TestMethod]
public void GetCandidatesCollection_Test()
{
var sut =new DocumentDBDemo.DocumentDBProvider();
var result = sut.GetCandidatesCollection();
Assert.IsNotNull(result);
}
[TestMethod]
public void GetCandidateById_Test()
{
var sut =new DocumentDBDemo.DocumentDBProvider();
var result = sut.GetCandidateById(1);
Assert.IsNotNull(result);
}
}

Легко, не так ли? Я считаю, что это работает с классами Poco очень естественно, и сериализация и десериализация происходят очень гладко, а код довольно чистый, и когда у вас есть более сложные объекты, ваш код все равно останется таким же, как указано выше, и это очень интересно!

И вы можете просматривать свои документы и коллекции документов на портале Azure и в своих документах.

Итак, вы нажимаете на свою базу данных DocumentDb, а затем на свою DocumentCollection, а затем на ссылку Document Explorer, и вы можете увидеть свои документы, хранящиеся там (вы увидите один Guid для каждого документа), и, щелкнув каждый Guid, вы можете увидеть содержимое документа в формате JSON:

Вы можете найти этот фрагмент кода на GitHub здесь: https://github.com/aramkoukia/AzureDocumentDBDemo

В ближайшем будущем я сравню производительность DocumentDB при хранении и извлечении данных с SQL Azure и посмотрю, что получится.