Azure Cosmos DB-mellékletek
A KÖVETKEZŐKRE VONATKOZIK: NoSQL
MongoDB
Az Azure Cosmos DB-mellékletek olyan speciális elemek, amelyek külső blob- vagy médiafájllal társított metaadatokra mutató hivatkozásokat tartalmaznak.
Az Azure Cosmos DB kétféle mellékletet támogat:
- A nem felügyelt mellékletek egy külső szolgáltatásban (például Azure Storage, OneDrive stb.) tárolt blobra mutató URI-hivatkozás burkolói. Ez a megközelítés hasonlít egy URI-tulajdonság standard Azure Cosmos DB-elemben való tárolásához.
- A felügyelt mellékletek az Azure Cosmos DB által belsőleg felügyelt és tárolt blobok , amelyek egy rendszer által létrehozott mediaLinken keresztül érhetők el.
Feljegyzés
A mellékletek régi funkciók. Ha már használja ezt a funkciót, a támogatás hatóköre a folyamatos működésre terjed ki.
A mellékletek használata helyett azt javasoljuk, hogy az Azure Blob Storage-t használja célalapú blobtároló szolgáltatásként a blobadatok tárolására. Az Azure Cosmos DB-ben továbbra is tárolhatja a blobokhoz kapcsolódó metaadatokat, valamint hivatkozási URI-hivatkozásokat elemtulajdonságként. Az adatok Azure Cosmos DB-ben való tárolása lehetővé teszi az Azure Blob Storage-ban tárolt blobok metaadatainak és hivatkozásainak lekérdezését.
A Microsoft elkötelezte magát amellett, hogy legalább 36 hónapos értesítést küld a mellékletek teljes elavulása előtt, amelyet egy későbbi időpontban jelentünk be.
Ismert korlátozások
Az Azure Cosmos DB felügyelt mellékletei eltérnek a standard elemek támogatásától, amelyekhez korlátlan skálázhatóságot, globális terjesztést és integrációt kínál más Azure-szolgáltatásokkal.
- A mellékletek nem támogatottak az Azure Cosmos DB SDK-k minden verziójában.
- A felügyelt mellékletek adatbázisfiókonként legfeljebb 2 GB tárterületet képesek tárolni.
- A felügyelt mellékletek nem kompatibilisek az Azure Cosmos DB globális disztribúciójával, és nem replikálódnak régiók között.
Feljegyzés
A MongoDB 3.2-es verziójához készült Azure Cosmos DB felügyelt mellékleteket használ a GridFS-hez, és ezekre ugyanazok a korlátozások vonatkoznak.
Javasoljuk, hogy a MongoDB GridFS szolgáltatáskészletet használó fejlesztők frissítsenek a MongoDB 3.6-os vagy újabb verziójára az Azure Cosmos DB-re, amely leválasztva van a mellékletektől, és jobb élményt nyújt. Másik lehetőségként a MongoDB GridFS szolgáltatáskészletet használó fejlesztőknek érdemes megfontolni az Azure Blob Storage használatát is , amely a blobtartalmak tárolására szolgál, és a GridFS-hez képest alacsonyabb költséggel kínál bővített funkciókat.
Mellékletek migrálása az Azure Blob Storage-ba
Javasoljuk, hogy az Alábbi lépések végrehajtásával migrálja az Azure Cosmos DB-mellékleteket az Azure Blob Storage-ba:
- Másolja a mellékletadatokat a forrás Azure Cosmos DB-tárolóból a cél Azure Blob Storage-tárolóba.
- Ellenőrizze a feltöltött blobadatokat a cél Azure Blob Storage-tárolóban.
- Ha alkalmazható, adjon hozzá URI-hivatkozásokat az Azure Blob Storage-ban található blobokra sztringtulajdonságként az Azure Cosmos DB-adathalmazban.
- Az alkalmazás kódjának újrabontása blobok olvasásához és írásához az új Azure Blob Storage-tárolóból.
Az alábbi kódminta bemutatja, hogyan másolhat mellékleteket az Azure Cosmos DB-ből az Azure Blob Storage-ba a migrálási folyamat részeként az Azure Cosmos DB .NET SDK v2 és az Azure Blob Storage .NET SDK v12 használatával. Győződjön meg arról, hogy lecseréli a <placeholder values>
forrás Azure Cosmos DB-fiókra, és megcélozza az Azure Blob Storage-tárolót.
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);
}
}
}
Következő lépések
- Az Azure Blob Storage használatának első lépései
- Hivatkozások lekérése mellékletek használatához az Azure Cosmos DB .NET SDK v2-en keresztül
- Hivatkozások lekérése mellékletek használatához az Azure Cosmos DB Java SDK v2-en keresztül
- Hivatkozások lekérése mellékletek használatához az Azure Cosmos DB REST API-ján keresztül