Aggiornare un documento Firestore in una transazione
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Aggiornare un documento Firestore in una transazione
Per saperne di più
Per la documentazione dettagliata che include questo esempio di codice, vedi quanto segue:
Esempio di codice
Salvo quando diversamente specificato, i contenuti di questa pagina sono concessi in base alla licenza Creative Commons Attribution 4.0, mentre gli esempi di codice sono concessi in base alla licenza Apache 2.0. Per ulteriori dettagli, consulta le norme del sito di Google Developers. Java è un marchio registrato di Oracle e/o delle sue consociate.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Difficile da capire","hardToUnderstand","thumb-down"],["Informazioni o codice di esempio errati","incorrectInformationOrSampleCode","thumb-down"],["Mancano le informazioni o gli esempi di cui ho bisogno","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","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)."]]