2018-09-11 14:11:24 +03:00
Update mutation
===============
2018-12-03 15:12:24 +03:00
.. contents :: Table of contents
:backlinks: none
:depth: 1
:local:
2019-01-21 12:20:14 +03:00
Auto-generated update mutation schema
-------------------------------------
2019-02-06 09:39:36 +03:00
**For example** , the auto-generated schema for the update mutation field for a table `` article `` looks like this:
2018-12-03 15:12:24 +03:00
.. code-block :: graphql
update_article (
_inc: article_inc_input
_set: article_set_input
where: article_bool_exp!
): article_mutation_response
# response of any mutation on the table "article"
type article_mutation_response {
# number of affected rows by the mutation
affected_rows: Int!
#data of the affected rows by the mutation
returning: [article!]!
}
As you can see from the schema:
- `` where `` argument is compulsory to filter rows to be updated. See :doc: `Filter queries <../queries/query-filters>`
for filtering options. Objects can be updated based on filters on their own fields or those in their nested objects.
- You can return the number of affected rows and the affected objects (with nested objects) in the response.
2018-09-11 14:11:24 +03:00
2019-02-06 09:39:36 +03:00
See the :ref: `update mutation API reference <update_syntax>` for the full specifications
2018-09-11 14:11:24 +03:00
.. note ::
2019-01-21 12:20:14 +03:00
- At least any one of `` _set `` , `` _inc `` operators or the jsonb operators `` _append `` , `` _prepend `` , `` _delete_key `` ,
`` _delete_elem `` , `` _delete_at_path `` is required.
2019-03-22 10:08:42 +03:00
2019-01-21 12:20:14 +03:00
- If a table is not in the `` public `` Postgres schema, the update mutation field will be of the format
`` update_<schema_name>_<table_name> `` .
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
Update based on an object's fields
----------------------------------
**Example:** Update the `` title `` , `` content `` and `` rating `` of the article with a given `` id `` :
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
2018-12-03 15:12:24 +03:00
mutation update_article {
update_article(
2018-09-11 14:11:24 +03:00
where: {id: {_eq: 3}},
2018-12-03 15:12:24 +03:00
_set: {
title: "lorem ipsum",
content: "dolor sit amet",
rating: 2
}
2018-09-11 14:11:24 +03:00
) {
affected_rows
2018-12-03 15:12:24 +03:00
returning {
id
title
content
rating
}
2018-09-11 14:11:24 +03:00
}
}
:response:
{
"data": {
2018-12-03 15:12:24 +03:00
"update_article": {
"affected_rows": 1,
"returning": [
{
"id": 3,
"title": "lorem ipsum",
"content": "dolor sit amet",
"rating": 2
}
]
2018-09-11 14:11:24 +03:00
}
}
}
2019-02-06 09:39:36 +03:00
Update based on an object's fields (using variables)
----------------------------------------------------
**Example:** Update the `` title `` , `` content `` and `` rating `` of the article with a given `` id `` :
.. graphiql ::
:view_only:
:query:
mutation update_article($id: Int, $changes: article_set_input) {
update_article(
where: {id: {_eq: $id}},
_set: $changes
) {
affected_rows
returning {
id
title
content
rating
}
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 1,
"returning": [
{
"id": 3,
"title": "lorem ipsum",
"content": "dolor sit amet",
"rating": 2
}
]
}
}
}
:variables:
{
"id": 3,
"changes": {
"title": "lorem ipsum",
"content": "dolor sit amet",
"rating": 2
}
}
OR
.. graphiql ::
:view_only:
:query:
mutation update_article($id: Int, $title: String, $content: String, $rating: Int) {
update_article(
where: {id: {_eq: $id}},
_set: {
title: $title,
content: $content,
rating: $rating
}
) {
affected_rows
returning {
id
title
content
rating
}
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 1,
"returning": [
{
"id": 3,
"title": "lorem ipsum",
"content": "dolor sit amet",
"rating": 2
}
]
}
}
}
:variables:
{
"id": 3,
"title": "lorem ipsum",
"content": "dolor sit amet",
"rating": 2
}
2018-12-03 15:12:24 +03:00
Update based on a nested object's fields
----------------------------------------
**Example:** Update the `` rating `` of all articles authored by "Sidney":
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
mutation update_ratings {
update_article(
where: {author: {name: {_eq: "Sidney"}}},
_set: {rating: 1}
) {
affected_rows
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 3
}
}
}
2018-12-03 15:12:24 +03:00
Increment **int** columns
-------------------------
You can increment an `` int `` column with a given value using the `` _inc `` operator.
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
**Example:** Increment the `` likes `` of an article by 2:
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
mutation update_likes {
update_article(
where: {id: {_eq: 1}},
2018-12-03 15:12:24 +03:00
_inc: {likes: 2} # initial value: 1
2018-09-11 14:11:24 +03:00
) {
affected_rows
returning {
id
likes
}
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 1,
"returning": {
"id": 1,
2018-12-03 15:12:24 +03:00
"likes": 3
2018-09-11 14:11:24 +03:00
}
}
}
}
2018-12-03 15:12:24 +03:00
Update **jsonb** columns
------------------------
The currently available `` jsonb `` operators are:
+----------------------+------------------------+--------------------------------------------------+
| Operator | Postgres equivalent | Function |
+======================+========================+==================================================+
| `` _append `` | `` || `` | append json value to a `` jsonb `` column |
+----------------------+------------------------+--------------------------------------------------+
| `` _prepend `` | `` || `` | prepend json value to a `` jsonb `` column |
+----------------------+------------------------+--------------------------------------------------+
| `` _delete_key `` | `` - `` | delete top-level key from `` jsonb `` column |
+----------------------+------------------------+--------------------------------------------------+
| `` _delete_elem `` | `` - `` | delete array element from `` jsonb `` column |
+----------------------+------------------------+--------------------------------------------------+
| `` _delete_at_path `` | `` #- `` | delete element at a path from `` jsonb `` column |
+----------------------+------------------------+--------------------------------------------------+
2018-09-11 14:11:24 +03:00
.. note ::
2018-12-03 15:12:24 +03:00
You can learn more about Postgres jsonb operators `here <https://www.postgresql.org/docs/current/static/functions-json.html#FUNCTIONS-JSONB-OP-TABLE> `__
.. contents :: Examples
:backlinks: none
:depth: 1
:local:
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
Append a json to a jsonb column
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can append any `` jsonb `` column with another json value by using the `` _append `` operator.
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
Since the input is a json value, it should be provided through a variable.
2018-09-11 14:11:24 +03:00
2019-02-06 09:39:36 +03:00
**Example:** Append the json `` {"key1": "value1"} `` to `` jsonb `` column `` extra_info `` of `` article `` table:
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
mutation update_extra_info($value: jsonb) {
update_article(
where: {id: {_eq: 1}},
2018-12-03 15:12:24 +03:00
_append: {extra_info: $value} # initial value: {"key": "value"}
2018-09-11 14:11:24 +03:00
) {
affected_rows
returning {
id
extra_info
}
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 1,
"returning": {
"id": 1,
"extra_info": {
2018-12-03 15:12:24 +03:00
"key": "value",
"key1": "value1"
2018-09-11 14:11:24 +03:00
}
}
}
}
}
2019-01-15 17:34:39 +03:00
:variables:
{
"value": { "key1": "value1" }
}
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
Prepend a json to a jsonb column
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can prepend any `` jsonb `` column with another json value by using the `` _prepend `` operator.
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
Since the input is a json value, it should be provided through a variable.
2019-02-06 09:39:36 +03:00
**Example:** Prepend the json `` {"key0": "value0"} `` to `` jsonb `` column `` extra_info `` of `` article `` table:
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
mutation update_extra_info($value: jsonb) {
update_article(
where: {id: {_eq: 1}},
2018-12-03 15:12:24 +03:00
_prepend: {extra_info: $value} # initial value "{"key": "value", "key1": "value1"}"
2018-09-11 14:11:24 +03:00
) {
affected_rows
returning {
id
extra_info
}
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 1,
"returning": {
"id": 1,
"extra_info": {
"key0": "value0",
2018-12-03 15:12:24 +03:00
"key": "value",
"key1": "value1"
2018-09-11 14:11:24 +03:00
}
}
}
}
}
2019-01-15 17:34:39 +03:00
:variables:
{
"value": { "key0": "value0" }
}
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
Delete a top-level key from a jsonb column
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can delete a top-level key of a `` jsonb `` column by using the `` _delete_key `` operator.
Input value should be a `` String `` .
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
**Example:** Delete the key `` key `` in the `` jsonb `` column `` extra_info `` of `` article `` table:
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
mutation update_extra_info {
update_article(
where: {id: {_eq: 1}},
2018-12-03 15:12:24 +03:00
_delete_key: {extra_info: "key"} # initial value "{"key0": "value0, "key": "value", "key1": "value1"}"
2018-09-11 14:11:24 +03:00
) {
affected_rows
returning {
id
extra_info
}
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 1,
"returning": {
"id": 1,
"extra_info": {
2018-12-03 15:12:24 +03:00
"key0": "value0",
"key1": "value1"
2018-09-11 14:11:24 +03:00
}
}
}
}
}
2018-12-03 15:12:24 +03:00
Delete an element from a jsonb column storing a json array
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If a `` jsonb `` column is storing a json array, you can delete an element from the array using the `` _delete_elem ``
operator.
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
Input value should be an `` Int `` .
**Example:** Delete the element at position 2 in the array value of `` jsonb `` column `` extra_info ``
of `` article `` table:
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
mutation update_extra_info {
update_article(
where: {id: {_eq: 1}},
2018-12-03 15:12:24 +03:00
_delete_elem: {extra_info: 2} # initial value "["a", "b", "c"]"
2018-09-11 14:11:24 +03:00
) {
affected_rows
returning {
id
extra_info
}
}
}
:response:
{
"data": {
"update_article": {
"affected_rows": 1,
"returning": {
"id": 1,
"extra_info": ["a", "b"]
}
}
}
}
2018-12-03 15:12:24 +03:00
Delete an element at a specific path in a jsonb column
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You can delete a field or element of a `` jsonb `` column at a specified path by using the `` _delete_at_path `` operator.
Input value should be a `` String Array `` .
2018-09-11 14:11:24 +03:00
2018-12-03 15:12:24 +03:00
**Example:** Delete element at json path `` name.last `` in `` jsonb `` column `` extra_info `` of author table:
2018-09-11 14:11:24 +03:00
.. graphiql ::
:view_only:
:query:
mutation update_extra_info {
update_author(
where: {id: {_eq: 1}},
2018-12-03 15:12:24 +03:00
_delete_at_path: {extra_info: ["name", "first"]} # initial value "{"name": {"first": "first_name", "last": "last_name"}}"
2018-09-11 14:11:24 +03:00
) {
affected_rows
returning {
id
extra_info
}
}
}
:response:
{
"data": {
"update_author": {
"affected_rows": 1,
"returning": {
"id": 1,
"extra_info": {
"name": {
"last": "last_name"
}
}
}
}
}
}