Data Types
In DQL, you’ll use three data types:REGISTER, MAP, and ATTACHMENT type. By
default, fields in a DQL statement are assigned the REGISTER type unless
otherwise specified by way of type definition.
Following are the key characteristics:
| Type | REGISTER | MAP | ATTACHMENT | PN_COUNTER |
|---|---|---|---|---|
| CRDT type | Last-write-wins | Add-wins | Last-write-wins | Positive-negative |
| Payload | Any | Object | Binary file | Double |
Data Type Operations
Data types have different operations available.REGISTER Operations
A Register supports scalar types, including primitive types, such asstring
and boolean, as well as a JSON blob, encapsulating multiple field‑value pairs
that function as a single object. The REGISTER can only be set to a specific
field.
For example:
DQL
MAP Operations
TheMAP type supports inserting and tombstoning of fields using the functional
operators. Inserting a field is an implicit operation performed by assigning a
value to a field or a child of the field.
ATTACHMENT Operations
To set the last-write-winsATTACHMENT data type, provide an ATTACHMENT object:
DQL
Counter Operations
Counters are available in 4.11 and later. Read more
- Like/vote counts
- Number of views or interactions
Do not initialize counter fields by inserting a double value (e.g.,
0.0). This creates a register field, not a counter. Counter fields are automatically created when you first use PN_INCREMENT on them.PN_INCREMENT operation directly on the field. If the field doesn’t exist, it will be created as a counter with the increment value. If you need to create a document first, insert it without the counter field or with other fields only:
PN_INCREMENT keyword followed by the value. To decrement a counter, use a
negative value.
SELECT statement:
Default Value Operation
Some data types can be set to a default value type using thedefault()
functional operator.
REGISTER→NULLAWMAP→ Empty Map{}ATTACHMENT→ NOT SUPPORTEDPN_COUNTER→ NOT SUPPORTED
Declaring Type Definition
With strict mode enabled, all fields are treated as a register by default. When enabled, every field in a document must match the collection definition exactly — including its CRDT type (e.g., map, register, counter). Disabling strict mode enables new functionality: when set to false, collection definitions are no longer required. SELECT queries will return and display all fields by default. Registers
AREGISTER is a data type in Ditto that stores a single scalar value and
uses last-write-wins merge strategy for handling conflicts.
Key characteristics of REGISTER:
- Stores primitive types (string, boolean) or JSON objects
- Last-write-wins conflict resolution ensures consistent values across peers
DQL_STRICT_MODE=false, if you want to force a JSON Object to use a
REGISTER data type instead of a MAP in DQL, it must be specified explicitly.
UNSET statement at the top level. Because a register map is treated the same as a scalar value (such as string, int), you operate on the entire object as a whole, similar to a JSON blob.
SET or UNSET a nested key of a register using dot notation.
Non-Registers
In 4.11+ and
DQL_STRICT_MODE=false, collection definitions for non-registers are no longer required.Read moreDQL_STRICT_MODE=true, REGISTER is the default type in DQL. That means
that you need to specify the type definition when overriding with type MAP, PN_COUNTER, or
ATTACHMENT within your query.
DQL type definitions describe the schema of the documents within a specific
collection — defining the field types within the collection and specifying the
assigned data types for each field.
To explicitly declare the type definition as non-REGISTER type, add a prefix
of COLLECTION and the suffix of (field1 data_type, field2 data_type, ...) to
list the fields within the collection and their associated data types:
DQL
DQL
COLLECTIONdeclares that the collection has a type definitionyour_collection_nameis the name of the collection from which you want to set a definition.(field1 data_type, field2 data_type, ...)specifies the data type of each field such asREGISTER,MAP, orATTACHMENT
DQL
DQL
DQL
MAP (Add-Wins Map) contains fields with their own data type. Data types for these fields are defined using parentheses following the MAP keyword. For example, MAP(sub1 data_type, sub2 data_type, ...):
DQL
MAP with all other fields type REGISTER:
DQL
ATTACHMENT with all other fields type REGISTER:
DQL
MAP and a single ATTACHMENT with all other fields type REGISTER:
DQL
The syntax for a document hierarchy of depth two — a single
MAP nested with another MAP — with all other fields type REGISTER:
DQL
REGISTER:
DQL