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.
DQL_STRICT_MODE
settings:true
(4.10 and below), nested objects default to REGISTER typeFeature | SDK <4.10: DQL_STRICT_MODE=true | SDK 4.11+: DQL_STRICT_MODE=false |
---|---|---|
Nested MAPs | ❌ Requires explicit definitions | ✅ Supported (automatic inference) |
Collection Definitions | ❌ Required | ✅ Optional |
Legacy Compatibility | ❌ Not supported | ✅ Supported |
Default object type | REGISTER (whole object replacement) | MAP (field-level merging) |
Nested field updates without definitions | ⚠️ Replaces entire object | ✅ Merges individual fields |
true
) in v4, but will be set to false
in v5.DQL_STRICT_MODE=false
, you MUST use the /store/v5/execute
endpoint/store/v4/execute
) does not support DQL_STRICT_MODE=false
/store/v5/execute
endpoint.
This endpoint allows you to execute DQL statements without needing to define
collection types and properly handles DQL_STRICT_MODE=false
behavior.
Endpoint Compatibility:
Endpoint | Supports strict_mode=false | Use When |
---|---|---|
/store/v4/execute | ❌ No | All SDK peers have strict_mode=true |
/store/v5/execute | ✅ Yes | Any peers have strict_mode=false |
/store/v5/execute
and changes will sync to v4 clients without issues.
Example HTTP Request:
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 UPDATE
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.
DQL_STRICT_MODE
setting, behavior is predictable:
false
: Objects are treated as MAPs by default, nested updates work as expectedtrue
: Collection definitions are required, types must be explicitly definedDQL_STRICT_MODE
settings:
DQL_STRICT_MODE=true
treats undefined objects as REGISTERsDQL_STRICT_MODE=false
treats objects as MAPsScenario | v4.10 and earlier | v4.11+ |
---|---|---|
All peers same setting | Requires collection definitions | Works with or without definitions |
Mixed settings, no definitions | Nested updates may fail | Objects default to REGISTER on strict=true peers |
Mixed settings, with MAP definitions | Works correctly | Works correctly |
strict_mode=true
while the updating peer has strict_mode=false
. Without a MAP definition, metadata
is treated as a REGISTER.
Solutions: