Available in v4.11 and later, strict mode helps Ditto enforce structure and type safety in your collections.
false
,
collection definitions are no longer required. SELECT queries
will return and display all fields by default. This matches the behavior of the
legacy query language. - objects in INSERT and UPDATE statements are treated as
maps. When a field has multiple possible types, the most recently updated type
is chosen.
Feature | DQL_STRICT_MODE=true | DQL_STRICT_MODE=false |
---|---|---|
Nested MAPs | ❌ Difficult to use | ✅ Supported |
Collection Definitions | ❌ Required | ✅ Optional |
Legacy Compatibility | ❌ Not supported | ✅ Supported |
true
) in v4, but will be set to false
in v5./store/v5/execute
endpoint.
This endpoint allows you to execute DQL statements without needing to define
collection types.
v5 and v4 API are compatible, so you can use
/store/v5/execute
and changes will sync to v4 clients without issues.
Read more about the HTTP API.
startSync
or creating your DQL subscriptions, observers, or execute
statements.
DQL_STRICT_MODE
is enabled or disabled.
DQL_STRICT_MODE=false
, objects are treated as maps. In the following
examples, items
is a map: each key points to some object. This structure is
common in NoSQL/document-style databases.
DQL_STRICT_MODE=false
,, Ditto infers the CRDT type based on the
document’s shape. No collection definition is required.
items: {"shake": ..., "fries": ...}
, Ditto treats that as a MAP when strict mode is disabled.UPDATE
statement to set nested MAPs.
Using UPDATE
INSERT
and ON ID CONFLICT DO MERGE
to update nested maps with dynamic
UUIDs. This is the same behavior as using upsert
in the legacy query builder.
DQL_STRICT_MODE=false
, use the UNSET
statement.
REGISTER
is a data type in Ditto that stores a single scalar value and
uses last-write-wins merge strategy for handling conflicts.
With DQL_STRICT_MODE=false
, if you want a REGISTER JSON object data type in DQL, it must be
specified explicitly.
Key characteristics of REGISTER:
DQL_STRICT_MODE=false
, Ditto is more flexible and will infer the
CRDT type based on the document’s shape, meaning that collection definitions
are no longer required:
true
, Ditto infers the CRDT type based on the
document’s shape. By default, objects treated as registers, which means that
every field’s type must be specified in the collection definition.
In this case, the items field is a map, so it must be defined as such in the
collection definition.
DQL_STRICT_MODE=false
, if there is no collection definition provided,
objects will be implicitly updating the MAP after a dot update operation, even
if a register exists on disk.
This is called “last write wins” behavior, and it means that the last
operation to write to a field will overwrite any previous values, regardless of
the type of the field.