see on GitHub

What are Attachments

In RavenDB, attachments are binary streams which can be bound to an existing document. Each attachment has a name, and you can specify the content type (image/png or application/pdf for example).

A document can have any number of attachments.

Each attachment is bound to an existing document. In order to get a document, you'll need to specify the document ID and the attachment name. What's great in this approach is that you can specify the attachment's metadata in the document itself, and this document can be queried as any other document.

Example I

In order to store an album of pictures in RavenDB, you can create the following "albums/1" document:

{
    "UserId": "users/1",
    "Name": "Holidays",
    "Description": "Holidays travel pictures of the all family",
    "Tags": ["Holidays Travel", "All Family"],
    "@metadata": {
        "@collection": "Albums"
    }
}

This document can have the following attachments:

Name Content type
001.jpg image/jpeg
002.jpg image/jpeg
003.jpg image/jpeg
004.mp4 video/mp4

Example II

You can store a users/1 document and attach to it to a profile picture. When requesting the document from the server the results would be:

{
  "Name": "Hibernating Rhinos",
  "@metadata": {
    "@attachments": [
      {
        "ContentType": "image/png",
        "Hash": "iFg0o6D38pUcWGVlP71ddDp8SCcoEal47kG3LtWx0+Y=",
        "Name": "profile.png",
        "Size": 33241
      }
    ],
    "@collection": "Users",
    "@change-vector": "A:1061-D11EJRPTVEGKpMaH2BUl9Q",
    "@flags": "HasAttachments",
    "@id": "users/1",
    "@last-modified": "2017-12-05T12:36:24.0504021Z"
  }
}

Note that this document has an HasAttachments flag and an @attachments array with the attachment's info.

You can see the attachment's name, content type, hash and size.

Note

We would store the attachment streams by the hash, so if many attachments have the same hash, their streams would be stored just once.

Transaction Support

In RavenDB, attachment and documents are stored as ACID transaction: You either get all of them saved to disk or none.

Revisions and Attachments

When the revisions feature is turned on in your database, each attachment addition to a document (or deletion from a document) will create a new revision of the document, as there will be a change to the document's metadata, as shown in example #2.