Share via


Azure Cosmos DB-bijlagen

VAN TOEPASSING OP: NoSQL MongoDB

Azure Cosmos DB-bijlagen zijn speciale items die verwijzingen bevatten naar een gekoppeld metagegevensbestand met een externe blob of mediabestand.

Azure Cosmos DB ondersteunt twee typen bijlagen:

  • Onbeheerde bijlagen zijn een wrapper rond een URI-verwijzing naar een blob die is opgeslagen in een externe service (bijvoorbeeld Azure Storage, OneDrive, enzovoort). Deze benadering is vergelijkbaar met het opslaan van een URI-eigenschap in een standaard Azure Cosmos DB-item.
  • Beheerde bijlagen worden beheerd en intern opgeslagen door Azure Cosmos DB en weergegeven via een door het systeem gegenereerde mediaLink.

Notitie

Bijlagen zijn een verouderde functie. Hun ondersteuning is bedoeld om doorlopende functionaliteit te bieden als u deze functie al gebruikt.

In plaats van bijlagen te gebruiken, raden we u aan Om Azure Blob Storage te gebruiken als een speciaal gebouwde blobopslagservice om blobgegevens op te slaan. U kunt metagegevens met betrekking tot blobs, samen met referentie-URI-koppelingen, blijven opslaan in Azure Cosmos DB als itemeigenschappen. Als u deze gegevens opslaat in Azure Cosmos DB, kunt u query's uitvoeren op metagegevens en koppelingen naar blobs die zijn opgeslagen in Azure Blob Storage.

Microsoft streeft ernaar een kennisgeving van minimaal 36 maanden te verstrekken voordat bijlagen volledig worden afgeschaft, die op een verdere datum worden aangekondigd.

Bekende beperkingen

De beheerde bijlagen van Azure Cosmos DB verschillen van de ondersteuning voor standaarditems, waarvoor het onbeperkte schaalbaarheid, wereldwijde distributie en integratie met andere Azure-services biedt.

  • Bijlagen worden niet ondersteund in alle versies van de Azure Cosmos DB SDK's.
  • Beheerde bijlagen zijn beperkt tot 2 GB opslagruimte per databaseaccount.
  • Beheerde bijlagen zijn niet compatibel met de wereldwijde distributie van Azure Cosmos DB en worden niet gerepliceerd in verschillende regio's.

Notitie

Azure Cosmos DB voor MongoDB versie 3.2 maakt gebruik van beheerde bijlagen voor GridFS. Deze zijn onderhevig aan dezelfde beperkingen.

Ontwikkelaars wordt aangeraden de MongoDB GridFS-functie te gebruiken om een upgrade uit te voeren naar Azure Cosmos DB voor MongoDB versie 3.6 of hoger, die losgekoppeld is van bijlagen en een betere ervaring biedt. Ontwikkelaars die gebruikmaken van de MongoDB GridFS-functieset, moeten ook overwegen Om Azure Blob Storage te gebruiken. Dit is speciaal ontworpen voor het opslaan van blob-inhoud en biedt uitgebreide functionaliteit tegen lagere kosten in vergelijking met GridFS.

Bijlagen migreren naar Azure Blob Storage

U wordt aangeraden Azure Cosmos DB-bijlagen te migreren naar Azure Blob Storage door de volgende stappen uit te voeren:

  1. Kopieer bijlagen uit uw Azure Cosmos DB-broncontainer naar uw Azure Blob Storage-doelcontainer.
  2. Valideer de geĆ¼ploade blobgegevens in de Azure Blob Storage-doelcontainer.
  3. Voeg indien van toepassing URI-verwijzingen toe naar de blobs in Azure Blob Storage als tekenreekseigenschappen in uw Azure Cosmos DB-gegevensset.
  4. Herstructureer uw toepassingscode voor het lezen en schrijven van blobs uit de nieuwe Azure Blob Storage-container.

In het volgende codevoorbeeld ziet u hoe u bijlagen kopieert van Azure Cosmos DB naar Azure Blob Storage als onderdeel van een migratiestroom met behulp van de .NET SDK v2 van Azure Cosmos DB en Azure Blob Storage .NET SDK v12. Zorg ervoor dat u het <placeholder values> voor het Azure Cosmos DB-bronaccount en de Azure Blob Storage-container vervangt.


using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;

namespace attachments
{
    class Program
    {
        private static string cosmosAccount = "<Your_Azure_Cosmos_account_URI>";
        private static string cosmosKey = "<Your_Azure_Cosmos_account_PRIMARY_KEY>";
        private static string cosmosDatabaseName = "<Your_Azure_Cosmos_database>";
        private static string cosmosCollectionName = "<Your_Azure_Cosmos_collection>";
        private static string storageConnectionString = "<Your_Azure_Storage_connection_string>";
        private static string storageContainerName = "<Your_Azure_Storage_container_name>";
        private static DocumentClient cosmosClient = new DocumentClient(new Uri(cosmosAccount), cosmosKey);
        private static BlobServiceClient storageClient = new BlobServiceClient(storageConnectionString);
        private static BlobContainerClient storageContainerClient = storageClient.GetBlobContainerClient(storageContainerName);

        static void Main(string[] args)
        {
            CopyAttachmentsToBlobsAsync().Wait();
        }

        private async static Task CopyAttachmentsToBlobsAsync()
        {
            Console.WriteLine("Copying Azure Cosmos DB Attachments to Azure Blob Storage ...");

            int totalCount = 0;
            string docContinuation = null;

            // Iterate through each item (document in v2) in the Azure Cosmos DB container (collection in v2) to look for attachments.
            do
            {
                FeedResponse<dynamic> response = await cosmosClient.ReadDocumentFeedAsync(
                    UriFactory.CreateDocumentCollectionUri(cosmosDatabaseName, cosmosCollectionName),
                    new FeedOptions
                    {
                        MaxItemCount = -1,
                        RequestContinuation = docContinuation
                    });
                docContinuation = response.ResponseContinuation;

                foreach (Document document in response)
                {
                    string attachmentContinuation = null;
                    PartitionKey docPartitionKey = new PartitionKey(document.Id);

                    // Iterate through each attachment within the item (if any).
                    do
                    {
                        FeedResponse<Attachment> attachments = await cosmosClient.ReadAttachmentFeedAsync(
                            document.SelfLink,
                            new FeedOptions
                            {
                                PartitionKey = docPartitionKey,
                                RequestContinuation = attachmentContinuation
                            }
                        );
                        attachmentContinuation = attachments.ResponseContinuation;

                        foreach (var attachment in attachments)
                        {
                            // Download the attachment in to local memory.
                            MediaResponse content = await cosmosClient.ReadMediaAsync(attachment.MediaLink);

                            byte[] buffer = new byte[content.ContentLength];
                            await content.Media.ReadAsync(buffer, 0, buffer.Length);

                            // Upload the locally buffered attachment to blob storage
                            string blobId = String.Concat(document.Id, "-", attachment.Id);

                            Azure.Response<BlobContentInfo> uploadedBob = await storageContainerClient.GetBlobClient(blobId).UploadAsync(
                                new MemoryStream(buffer, writable: false),
                                true
                            );

                            Console.WriteLine("Copied attachment ... Item Id: {0} , Attachment Id: {1}, Blob Id: {2}", document.Id, attachment.Id, blobId);
                            totalCount++;

                            // Clean up attachment from Azure Cosmos DB.
                            // Warning: please verify you've succesfully migrated attachments to blog storage prior to cleaning up Azure Cosmos DB.
                            // await cosmosClient.DeleteAttachmentAsync(
                            //     attachment.SelfLink,
                            //     new RequestOptions { PartitionKey = docPartitionKey }
                            // );

                            // Console.WriteLine("Cleaned up attachment ... Document Id: {0} , Attachment Id: {1}", document.Id, attachment.Id);
                        }

                    } while (!string.IsNullOrEmpty(attachmentContinuation));
                }
            }
            while (!string.IsNullOrEmpty(docContinuation));

            Console.WriteLine("Finished copying {0} attachments to blob storage", totalCount);
        }
    }
}

Volgende stappen