【问题标题】:Adding an attachment on Azure CosmosDB在 Azure CosmosDB 上添加附件
【发布时间】:2018-11-01 13:11:57
【问题描述】:

我正在寻求有关如何在 CosmosDB 上添加附件的帮助。这是小背景。

我们的应用程序目前在 IBM Bluemix 上,我们正在使用 CloudantDB。我们使用 CloudanDB 来存储附件(PDF 文件)。我们不会迁移到 Azure PaaS 应用服务并计划使用 CosmosDB。我正在寻求有关如何使用 Java API 在 CosmosDB 上创建附件的帮助。我需要使用什么 API?我想做一个小型 POC。

谢谢,

【问题讨论】:

  • 我的回答对你有帮助吗?
  • 谢谢,是的,我认为这是唯一的方法。我正在查看 consmosDB 中的其他一些选项。比如 CouchDB。谢谢你的回答
  • 不客气。如果采纳 answer ,可以在论坛上标记以供其他人参考。谢谢!

标签: java azure nosql azure-cosmosdb


【解决方案1】:

我个人觉得在Azure中,如果你想将文件放入documentDb,你会为查询成本付出高昂的代价。相反,通常的做法是使用 Azure blob 并将链接保存在一个字段中,然后如果您希望它受到保护,则返回其公共或二进制数据的 url。

但是,您可以使用

来存储它
var myDoc = new { id = "42", Name = "Max", City="Aberdeen" }; // this is the document you are trying to save
var attachmentStream = File.OpenRead("c:/Path/To/File.pdf"); // this is the document stream you are attaching

var client = await GetClientAsync();
var createUrl = UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName);
Document document = await client.CreateDocumentAsync(createUrl, myDoc);

await client.CreateAttachmentAsync(document.SelfLink, attachmentStream, new MediaOptions()
    {
        ContentType = "application/pdf", // your application type
        Slug = "78", // this is actually attachment ID
    });

WORKING WITH ATTACHMENTS

我已经回答了一个类似的问题here

【讨论】:

  • 谢谢,我会调查这两个。在它说的文档中,我们可以存储的总文件大小为 2GB。 “Azure Cosmos DB 允许您使用 Azure Cosmos DB 存储二进制 blob/媒体(每个帐户最多 2 GB)”这是我们可以存储的最大值吗?
  • 我还有一个问题,我们正在使用 Java。我可以使用哪些客户端 API?
  • 你应该使用SDK,这里是一个示例代码github.com/Azure/azure-cosmosdb-java/blob/…
【解决方案2】:

我可以使用哪些客户端 API?

您可以关注cosmos db java sdk 到 CRUD 附件。

import com.microsoft.azure.documentdb.*;
import java.util.UUID;

public class CreateAttachment {

    // Replace with your DocumentDB end point and master key.
    private static final String END_POINT = "***";
    private static final String MASTER_KEY = "***";

    public static void main(String[] args) throws Exception, DocumentClientException {

        DocumentClient documentClient = new DocumentClient(END_POINT,
                MASTER_KEY, ConnectionPolicy.GetDefault(),
                ConsistencyLevel.Session);

        String uuid = UUID.randomUUID().toString();
        Attachment attachment = getAttachmentDefinition(uuid, "application/text");

        RequestOptions options = new RequestOptions();

        ResourceResponse<Attachment> attachmentResourceResponse = documentClient.createAttachment(getDocumentLink(), attachment, options);

    }

    private static Attachment getAttachmentDefinition(String uuid, String type) {
        return new Attachment(String.format(
                "{" +
                        "  'id': '%s'," +
                        "  'media': 'http://xstore.'," +
                        "  'MediaType': 'Book'," +
                        "  'Author': 'My Book Author'," +
                        "  'Title': 'My Book Title'," +
                        "  'contentType': '%s'" +
                        "}", uuid, type));
    }
}

在它说的文档中,我们可以存储的总文件大小为 2GB。 “Azure Cosmos DB 允许您存储二进制 blob/媒体 Azure Cosmos DB(每个帐户最多 2 GB)“我们可以做到的最大值吗? 商店?

是的。附件的大小在文档数据库中是有限的。但是,有两种方法可以创建 Azure Cosmos DB 文档附件。

1.将文件存储为文档的附件

原始附件包含在 POST 的正文中。 必须设置两个标题:

Slug – 附件的名称。 contentType – 设置为附件的 MIME 类型。

2.将文件的 URL 存储在文档的附件中

POST 的正文包括以下内容。

id – 它是标识附件的唯一名称,即没有两个附件将共享相同的 id。 ID 不得超过 255 个字符。 媒体 – 这是附件所在的 URL 链接或文件路径。

下面是一个例子

{  
    "id": "device\A234",  
    "contentType": "application/x-zip-compressed",  
    "media": "www.bing.com/A234.zip"  
}

如果您的文件超出限制,您可以尝试用第二种方式存储它们。更多详情请参考blog

此外,您可能会注意到 cosmos db 附件支持 垃圾收集机制,确保在所有未完成的引用被丢弃时对媒体进行垃圾收集。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多