FQL v4 will be decommissioned on June 30, 2025. Ensure that you complete your migration from FQL v4 to FQL v10 by that date. Fauna accounts created after August 21, 2024 must use FQL v10. These accounts will not be able to run FQL v4 queries or access the v4 Dashboard. For more details, see the v4 EOL announcement and migration guide. Contact support@fauna.com with any questions. |
Documents
Every record, of any kind, in a Fauna database is stored as an object called a document. Documents are made up of fields and their associated value, just like a JSON object. The value for any key can itself be a document.
See the limits page for details on document size and transaction limits. |
Every document belongs to a specific collection, similar to a table in other database systems, which groups similar documents together. Documents within collections are not required to share the same structure. Collections belong to a specific database.
Even the definitions of Databases, Collections, Keys, Indexes, and user-defined functions, are all documents. They exist within internal Fauna collections of the same name.
All documents have a set of common characteristics:
-
Documents have an identifier called a Reference (or just Ref). A document’s Reference is a compound value comprising its collection along with a unique document ID. A Reference is a unique identifier for the document within the scope of the database in which it is stored. The document ID is a string-encoded 64-bit integer.
The following query retrieves a specific document by its Reference, and returns a result that includes the document, the reference, and the components of the reference: the collection reference and the document ID:
{ document: { ref: Ref(Collection("users"), "1"), ts: 1625505428470000, data: { name: 'Alice Crypto', email: 'alice@site.example.com' } }, reference: Ref(Collection("users"), "1"), 'reference collection': Collection("users"), 'document ID': '1' }
{'document': {'ref': Ref(id=1, collection=Ref(id=users, collection=Ref(id=collections))), 'ts': 1625505236270000, 'data': {'name': 'Alice Crypto', 'email': 'alice@site.example.com'}}, 'reference': Ref(id=1, collection=Ref(id=users, collection=Ref(id=collections))), 'reference collection': Ref(id=users, collection=Ref(id=collections)), 'document ID': '1'}
map[document:map[data:map[email:alice@site.example.com name:Alice Crypto] ref:{1 0xc0000925a0 0xc0000925a0 <nil>} ts:1625506145900000] document ID:1 reference:{1 0xc000092780 0xc000092780 <nil>} reference collection:{users 0xc000092870 0xc000092870 <nil>}]
ObjectV(document: ObjectV(ref: RefV(id = "1", collection = RefV(id = "users", collection = RefV(id = "collections"))),ts: LongV(1625505840300000),data: ObjectV(name: StringV(Alice Crypto),email: StringV(alice@site.example.com))),reference: RefV(id = "1", collection = RefV(id = "users", collection = RefV(id = "collections"))),reference collection: RefV(id = "users", collection = RefV(id = "collections")),document ID: StringV(1))
{document: {ref: ref(id = "1", collection = ref(id = "users", collection = ref(id = "collections"))), ts: 1625506508690000, data: {name: "Alice Crypto", email: "alice@site.example.com"}}, reference: ref(id = "1", collection = ref(id = "users", collection = ref(id = "collections"))), reference collection: ref(id = "users", collection = ref(id = "collections")), document ID: "1"}
{ document: { ref: Ref(Collection("users"), "1"), ts: 1625504819720000, data: { name: 'Alice Crypto', email: 'alice@site.example.com' } }, reference: Ref(Collection("users"), "1"), 'reference collection': Collection("users"), 'document ID': '1' }
-
User-specified documents have a timestamp that identifies when the document was most recently updated. Fauna documents are versioned — each time a document is updated, a new version is stored — and the versions are distinguished using the timestamp. When a query does not specify a timestamp, the latest versions of any documents involved are used. The timestamp — returned in the
ts
field — is of type Long.ts
should not be directly manipulated. Instead, you can use theInsert
andRemove
functions to manipulate the history of a document at specific timestamps.To track timestamps independent of Fauna operations, include fields in your documents to record timestamps entirely under your control.
-
Documents can have an optional
ttl
field (meaning time-to-live), which is a Timestamp that indicates when the document should be removed. When a document is removed, the document’s existence ceases (as if it never existed); temporal queries cannot recover the document.See Temporality for more information about temporality.
-
Documents are manipulated with the same query language functions, such as
get
,create
,update
,replace
, ordelete
. Documents returned by queries are represented as JSON objects. Within a query, a document’s fields may be accessed using theSelect
function.
To separate the ref and timestamp from user-defined fields, Fauna
wraps each user-specified document in a metadata document for storage,
and user-specified data appears in the data
field. For example, when a
blog post document is created, it is stored as:
{
ref: Ref(Collection("posts"), "227576404750893579"),
ts: 1553292644000000,
data: {
title: 'My blog post',
tags: [ 'post', 'popular', 'blog' ],
body: "Lorem ipsum..."
}
}
Is this article helpful?
Tell Fauna how the article can be improved:
Visit Fauna's forums
or email docs@fauna.com
Thank you for your feedback!