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
→NULL
AWMAP
→ 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
COLLECTION
declares that the collection has a type definitionyour_collection_name
is 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