Updating a Firestore document in a transaction
Stay organized with collections
Save and categorize content based on your preferences.
Updating a Firestore document in a transaction
Explore further
For detailed documentation that includes this code sample, see the following:
Code sample
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],[],[[["\u003cp\u003eThis document provides code samples demonstrating how to update a Firestore document within a transaction across various programming languages.\u003c/p\u003e\n"],["\u003cp\u003eThe examples showcase how to retrieve a document snapshot, modify data, and commit the changes using a transaction, ensuring data consistency.\u003c/p\u003e\n"],["\u003cp\u003eEach code sample focuses on incrementing the population field of a "cities" collection's "SF" document, illustrating a common transaction use case.\u003c/p\u003e\n"],["\u003cp\u003eThe document highlights the importance of setting up Application Default Credentials for authenticating to Firestore in a local development environment.\u003c/p\u003e\n"],["\u003cp\u003eIt directs users to additional resources for further exploration of transactions and batched writes in Firestore, as well as the Google Cloud sample browser for more examples.\u003c/p\u003e\n"]]],[],null,["# Updating a Firestore document in a transaction\n\nExplore further\n---------------\n\n\nFor detailed documentation that includes this code sample, see the following:\n\n- [Transactions and batched writes](/firestore/native/docs/manage-data/transactions)\n- [Transactions and batched writes](https://firebase.google.com/docs/firestore/manage-data/transactions)\n\nCode sample\n-----------\n\n### C#\n\n\nTo authenticate to Firestore, set up Application Default Credentials.\nFor more information, see\n\n[Set up authentication for a local development environment](/docs/authentication/set-up-adc-local-dev-environment).\n\n DocumentReference cityRef = db.Collection(\"cities\").Document(\"SF\");\n await db.RunTransactionAsync(async transaction =\u003e\n {\n DocumentSnapshot snapshot = await transaction.GetSnapshotAsync(cityRef);\n long newPopulation = snapshot.GetValue\u003clong\u003e(\"Population\") + 1;\n Dictionary\u003cstring, object\u003e updates = new Dictionary\u003cstring, object\u003e\n {\n { \"Population\", newPopulation}\n };\n transaction.Update(cityRef, updates);\n });\n\n### Go\n\n\nTo authenticate to Firestore, set up Application Default Credentials.\nFor more information, see\n\n[Set up authentication for a local development environment](/docs/authentication/set-up-adc-local-dev-environment).\n\n\n import (\n \t\"context\"\n \t\"log\"\n\n \t\"cloud.google.com/go/firestore\"\n )\n\n func runSimpleTransaction(ctx context.Context, client *firestore.Client) error {\n \t// ...\n\n \tref := client.Collection(\"cities\").Doc(\"SF\")\n \terr := client.https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest/index.html#cloud_google_com_go_firestore_Client_RunTransaction(ctx, func(ctx context.Context, tx *firestore.Transaction) error {\n \t\tdoc, err := tx.Get(ref) // tx.Get, NOT ref.Get!\n \t\tif err != nil {\n \t\t\treturn err\n \t\t}\n \t\tpop, err := doc.https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest/index.html#cloud_google_com_go_firestore_DocumentSnapshot_DataAt(\"population\")\n \t\tif err != nil {\n \t\t\treturn err\n \t\t}\n \t\treturn tx.Set(ref, map[string]interface{}{\n \t\t\t\"population\": pop.(int64) + 1,\n \t\t}, firestore.https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest/index.html#cloud_google_com_go_firestore_MergeAll)\n \t})\n \tif err != nil {\n \t\t// Handle any errors appropriately in this section.\n \t\tlog.Printf(\"An error has occurred: %s\", err)\n \t}\n\n \treturn err\n }\n\n### Java\n\n\nTo authenticate to Firestore, set up Application Default Credentials.\nFor more information, see\n\n[Set up authentication for a local development environment](/docs/authentication/set-up-adc-local-dev-environment).\n\n // Initialize doc\n final DocumentReference docRef = db.collection(\"cities\").document(\"SF\");\n City city = new City(\"SF\");\n city.setCountry(\"USA\");\n city.setPopulation(860000L);\n docRef.set(city).get();\n\n // run an asynchronous transaction\n ApiFuture\u003cVoid\u003e futureTransaction =\n db.runTransaction(\n transaction -\u003e {\n // retrieve document and increment population field\n DocumentSnapshot snapshot = transaction.get(docRef).get();\n long oldPopulation = snapshot.getLong(\"population\");\n transaction.update(docRef, \"population\", oldPopulation + 1);\n return null;\n });\n // block on transaction operation using transaction.get()\n\n### Node.js\n\n\nTo authenticate to Firestore, set up Application Default Credentials.\nFor more information, see\n\n[Set up authentication for a local development environment](/docs/authentication/set-up-adc-local-dev-environment).\n\n // Initialize document\n const cityRef = db.collection('cities').doc('SF');\n await cityRef.set({\n name: 'San Francisco',\n state: 'CA',\n country: 'USA',\n capital: false,\n population: 860000\n });\n\n try {\n await db.runTransaction(async (t) =\u003e {\n const doc = await t.get(cityRef);\n\n // Add one person to the city population.\n // Note: this could be done without a transaction\n // by updating the population using FieldValue.increment()\n const newPopulation = doc.data().population + 1;\n t.update(cityRef, {population: newPopulation});\n });\n\n console.log('Transaction success!');\n } catch (e) {\n console.log('Transaction failure:', e);\n }\n\n### PHP\n\n\nTo authenticate to Firestore, set up Application Default Credentials.\nFor more information, see\n\n[Set up authentication for a local development environment](/docs/authentication/set-up-adc-local-dev-environment).\n\n $cityRef = $db-\u003ecollection('samples/php/cities')-\u003edocument('SF');\n $db-\u003erunTransaction(function (Transaction $transaction) use ($cityRef) {\n $snapshot = $transaction-\u003esnapshot($cityRef);\n $newPopulation = $snapshot['population'] + 1;\n $transaction-\u003eupdate($cityRef, [\n ['path' =\u003e 'population', 'value' =\u003e $newPopulation]\n ]);\n });\n\n### Python\n\n\nTo authenticate to Firestore, set up Application Default Credentials.\nFor more information, see\n\n[Set up authentication for a local development environment](/docs/authentication/set-up-adc-local-dev-environment).\n\n transaction = db.transaction()\n city_ref = db.collection(\"cities\").document(\"SF\")\n\n @firestore.transactional\n def update_in_transaction(transaction, city_ref):\n snapshot = city_ref.get(transaction=transaction)\n transaction.update(city_ref, {\"population\": snapshot.get(\"population\") + 1})\n\n update_in_transaction(transaction, city_ref)\n\n### Ruby\n\n\nTo authenticate to Firestore, set up Application Default Credentials.\nFor more information, see\n\n[Set up authentication for a local development environment](/docs/authentication/set-up-adc-local-dev-environment).\n\n city_ref = firestore.doc \"#{collection_path}/SF\"\n\n firestore.transaction do |tx|\n new_population = tx.get(city_ref).data[:population] + 1\n puts \"New population is #{new_population}.\"\n tx.update city_ref, { population: new_population }\n end\n\nWhat's next\n-----------\n\n\nTo search and filter code samples for other Google Cloud products, see the\n[Google Cloud sample browser](/docs/samples?product=firestore)."]]