Доступ к ресурсам по идентификатору в Azure DocumentDB

Я только начал играть с Azure DocumentDB, и мое волнение превратилось в замешательство. Это странно. Вроде бы ко всему (базам данных, коллекциям, документам) нужно обращаться не по его id, а по его «SelfLink». Например:

Я создаю базу данных:

public void CreateDatabase()
{
    using (var client = new DocumentClient(new Uri(endpoint), authKey))
    {
        Database db = new Database()
        {
            Id = "TestDB",
        };
        client.CreateDatabaseAsync(db).Wait();
    }
}

Затем позже когда-нибудь я хочу создать коллекцию:

public void CreateCollection()
{
    using (var client = new DocumentClient(new Uri(endpoint), authKey))
    {
        DocumentCollection collection = new DocumentCollection()
        {
            Id = "TestCollection",
        };
        client.CreateDocumentCollectionAsync(databaseLink: "???", documentCollection: collection).Wait();
    }
}

API хочет «databaseLink», когда я действительно предпочел бы дать ему идентификатор моей базы данных. У меня нет под рукой 'databaseLink'. Действительно ли DocumentDB ожидает, что я буду вытягивать список всех баз данных и искать в нем ссылку на базу данных каждый раз, когда я хочу что-то сделать?

Эта проблема идет наперекосяк. Я не могу сохранить документ в коллекцию, не имея «ссылки» на коллекцию.

public void CreateDocument()
{
    using (var client = new DocumentClient(new Uri(endpoint), authKey))
    {
        client.CreateDocumentAsync(documentCollectionLink: "???", document: new { Name = "TestName" }).Wait();
    }
}

Поэтому, чтобы сохранить документ, мне нужна ссылка на коллекцию. Чтобы получить ссылку на коллекции, мне нужна ссылка на базу данных. Чтобы получить ссылку на базу данных, мне нужно открыть список всех баз данных в моей учетной записи и просмотреть его. Затем я должен использовать эту ссылку базы данных, которую я нашел, чтобы вывести список коллекций в этой базе данных, которые я затем должен просеять в поисках ссылки на коллекцию, которую я хочу. Это не кажется правильным.

Я что-то пропустил? Я не понимаю, как это использовать? Почему я присваиваю идентификаторы всем своим ресурсам, когда DocumentDB настаивает на использовании собственной схемы ссылок для идентификации всего? Мой вопрос: «Как мне получить доступ к ресурсам DocumentDB по их идентификатору?»


person BowserKingKoopa    schedule 25.08.2014    source источник
comment
если вы хотите, чтобы эта функция была реализована, проголосуйте за нее на feedback.azure.com/ forums/263030-documentdb, которые помогут нам определить приоритеты запросов от пользователей.   -  person Ryan CrawCour    schedule 26.08.2014


Ответы (5)


Я бы порекомендовал вам посмотреть примеры кода здесь, в частности проект DocumentDB.Samples.ServerSideScripts.

В Program.cs вы найдете метод GetOrCreateDatabaseAsync:

/// <summary> 
/// Get or create a Database by id
/// </summary> 
/// <param name="id">The id of the Database to search for, or create.</param> 
/// <returns>The matched, or created, Database object</returns> 
private static async Task<Database> GetOrCreateDatabaseAsync(string id) 
{ 
    Database database = client.CreateDatabaseQuery()
        .Where(db => db.Id == id).ToArray().FirstOrDefault(); 
    if (database == null) 
    { 
        database = await client.CreateDatabaseAsync(
            new Database { Id = id }); 
    } 

    return database; 
} 

Чтобы ответить на ваш вопрос, вы можете использовать этот метод для поиска вашей базы данных по ее идентификатору и другим ресурсам (коллекциям, документам и т. д.), используя соответствующие методы Create[ResourceType]Query().

Надеюсь, это поможет.

person Robert C Navarro    schedule 25.08.2014
comment
Это, по-видимому, лучший способ сделать это с DocumentDB на данный момент. - person BowserKingKoopa; 17.09.2014
comment
Метод CreateDatabaseQuery больше не существует в клиентском объекте. Пытаюсь найти замену.... - person gg.; 03.10.2014
comment
Похоже, это метод расширения. Необходимо включить следующее в раздел использования Microsoft.Azure.Documents.Linq. - person gg.; 03.10.2014
comment
msdn.microsoft.com/ ru/library/azure/ - person gg.; 03.10.2014
comment
Я обнаружил, что это хорошая, более свежая установка примеров documentDB. github.com/Azure/ azure-documentdb-node/blob/ - person Rich Rousseau; 11.01.2016

Информация, опубликованная в других ответах за 2014 год, несколько устарела. Возможна прямая адресация по идентификатору:

Хотя _selflinks по-прежнему существуют и могут использоваться для доступа к ресурсам, с тех пор Microsoft добавила гораздо более простой способ поиска ресурсов по их идентификаторам, который не требует сохранения _selflink. :

УриФабрика

UriFactory.CreateDocumentCollectionUri(databaseId, collectionId))

UriFactory.CreateDocumentUri (databaseId, collectionId, идентификатор документа);

Это позволяет вам создать безопасный Uri (с допустимым, например, пробелом), который функционально идентичен ресурсам _selflink; пример, приведенный в объявлении Microsoft, показан ниже:

// Use **UriFactory** to build the DocumentLink
Uri docUri = UriFactory.CreateDocumentUri("SalesDb", "Catalog", "prd123");

// Use this constructed Uri to delete the document
await client.DeleteDocumentAsync(docUri);

Объявление от 13 августа 2015 г. можно найти здесь:

https://azure.microsoft.com/en-us/blog/azure-documentdb-bids-fond-farewell-to-self-links/

person dmcquiggin    schedule 21.03.2016

Вызов создания базы данных возвращает объект базы данных:

var database = client.CreateDatabaseAsync(new Database { Id = databaseName }).Result.Resource;

И тогда вы можете использовать это, чтобы создать свою коллекцию

var spec = new DocumentCollection { Id = collectionName };
spec.IndexingPolicy.IndexingMode = IndexingMode.Consistent;
spec.IndexingPolicy.Automatic = true;
spec.IndexingPolicy.IncludedPaths.Add(new IndexingPath { IndexType = IndexType.Range, NumericPrecision = 6, Path = "/" });
var options = new RequestOptions
{
    ConsistencyLevel = ConsistencyLevel.Session
};

var collection = client.CreateDocumentCollectionAsync(database.SelfLink, spec, options).Result.Resource;
person Renato Ferreira    schedule 28.08.2014

Методы client.Create... возвращают объекты, которые имеют ссылки на себя, которые вы ищете.

Database database = await client.CreateDatabaseAsync(
    new Database { Id = "Foo"});
DocumentCollection collection = await client.CreateDocumentCollectionAsync(
    database.SelfLink, new DocumentCollection { Id = "Bar" });
Document document = await client.CreateDocumentAsync(
    collection.SelfLink, new { property1 = "Hello World" });
person ArTrejo-MSFT    schedule 28.08.2014

Для удаления документа из секционированной коллекции используйте следующий формат:

result = await client.DeleteDocumentAsync(selfLink, new RequestOptions {
    PartitionKey = new PartitionKey(partitionKey)
});
person Bipin Puthiyaveetil    schedule 08.10.2016