DQL
- INSERT INTO is the name of the collection from which you want to retrieve the data.
DOCUMENTS ([document1]), ([document2]), ([document3]), ...represent the documents being inserted.- Alternative: You can use
VALUESinstead ofDOCUMENTS- they are functionally equivalent - Alternative: You can supply a
SELECTstatement in place of the document list, and the query results become the documents to insert
- Alternative: You can use
[ ON ID CONFLICT [FAIL | DO NOTHING | DO UPDATE | DO UPDATE_LOCAL_DIFF]]is an optional clause that allows for defining a policy if the ID already exists in the local data store. The default is to throw an error (FAIL).[RETURNING projection]is an optional clause that returns fields or expressions taken from the inserted documents. See RETURNING.
VALUES vs DOCUMENTS
BothVALUES and DOCUMENTS keywords work identically in INSERT statements. You can use either based on your preference:
DQL
- Single or multiple documents
- Parameters or literal objects
- Arrays of documents
ON ID CONFLICTclausesINITIALkeyword for default data
Mixing single documents and arrays in one statement (v5+): Any parameter in the With parameters
VALUES or DOCUMENTS list can be either a single document object or an array of document objects. When a parameter resolves to an array, each element is inserted as a separate document.DQL
{"single": {"a": 1}, "array": [{"a": 2}, {"a": 3}]}, this results in 3 documents being inserted.In Ditto, excluding fields from your payload doesn’t remove the existing data from the system.To remove a specific field from a document, use an explicit
UPDATE statement and UNSET that field. (See UPDATE)INSERT Document
INSERT with Multiple Documents
You can insert multiple documents in a single INSERT statement by providing multiple parameters or by passing an array of documents.Using Multiple Parameters
Using Array Parameters
You can also insert multiple documents by passing an array of objects as a parameter. This is particularly useful when you have a dynamic list of documents to insert.When using array parameters, each object in the array will be inserted as a separate document. You can combine array parameters with literal document parameters in the same INSERT statement.
INSERT from a SELECT Statement
Instead of aDOCUMENTS or VALUES list, you can supply a SELECT statement as the source. Each result of the query becomes one document to insert, and the projection aliases become the field names of that document:
DQL
field_a:
DQL
SELECT syntax is available as the source, so the documents to insert can be filtered, ordered, limited, aggregated or built from expressions:
DQL
Document IDs
The_id of each inserted document is taken from the query results:
- If the projection produces an
_idfield, that value is used as the document ID. - If it does not, a new document ID is generated for each document.
_id therefore preserves the source document’s ID, which will collide with the existing document when inserting into the same collection. Use an ON ID CONFLICT policy where that is intended:
DQL
ON ID CONFLICT and RETURNING both apply to a SELECT-sourced INSERT exactly as they do to a DOCUMENTS list. The INITIAL keyword does not: it requires literal document values and cannot be combined with a SELECT source.INSERT JSON-serialized Document
Starting with SDK 4.8, Ditto provides a convenient way to insert JSON-serialized documents using thedeserialize_json() function. This allows you to directly insert string-encoded JSON data into your collections without manually parsing it first.
INSERT with ID Conflict Handling
By default, the INSERT operation throws an error if an existing document with the same ID exists in the local Ditto store. However, Ditto allows some flexibility by allowing you to choose between ignoring the conflict (DO NOTHING) or updating existing documents (DO UPDATE) when a conflict occurs during an INSERT operation:
DQL
FAIL(default) will cause an error to be thrown if a document with the same_idcurrently exists in the local data store.DO NOTHINGwill make the statement succeed with no action taken.DO UPDATEwill perform a value update on every field in the provided document, even if the value is the same. This means all fields provided will be replicated to other peers regardless of whether the values actually changed.DO UPDATE_LOCAL_DIFF(SDK 4.12+) will only update fields whose values differ from the existing document. This is more efficient thanDO UPDATEwhen you want to avoid unnecessary replication of unchanged values.
DO UPDATE
UseDO UPDATE when you want to update all fields in the document regardless of whether the values have changed. This is useful when you want to ensure all fields are replicated to other peers, even if the values are the same as the existing document.
For example, inserting or updating a car — if there is a conflict (ON ID CONFLICT), execute the DO UPDATE conflict resolution policy:
DO UPDATE_LOCAL_DIFF
UseDO UPDATE_LOCAL_DIFF when you want to update only the fields that have actually changed. Unlike DO UPDATE, which updates every field regardless of whether the value changed, DO UPDATE_LOCAL_DIFF compares the incoming document against the existing local document and only updates fields with different values.
This is useful when:
- You want to minimize unnecessary replication traffic
- You’re frequently re-inserting documents where most fields remain unchanged
- You want to avoid triggering sync for unchanged data
INSERT with RETURNING
Add aRETURNING clause to get back the documents as they were written, rather than just the IDs of the documents that were inserted:
DQL
ON ID CONFLICT DO NOTHING policy are not written, so they are not returned.
For the full projection rules, aggregate support and the restrictions that apply, see RETURNING.
INSERT with INITIAL Documents
INSERT allows you to set specific documents as default data using the INITIAL DOCUMENTS action. Initial documents are the documents inserted at the beginning of time and are viewed by all peers as the same INSERT operation. This allows multiple peers to independently initialize the same default data safely, so regardless of the individual peer’s starting point.When inserting, the initial documents DO NOTHING if the document ID already exists in the local Ditto store. The ON ID CONFLICT policy cannot change this behavior.
DQL
your_collection_nameis the name of the collection from which you want to retrieve the data.[document]represents the document.