Firestore-Dokument in einer Transaktion bedingt aktualisieren
Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Firestore-Dokument in einer Transaktion bedingt aktualisieren
Weitere Informationen
Eine ausführliche Dokumentation, die dieses Codebeispiel enthält, finden Sie hier:
Codebeispiel
Nächste Schritte
Wenn Sie nach Codebeispielen für andere Google Cloud -Produkte suchen und filtern möchten, können Sie den Google Cloud -Beispielbrowser verwenden.
Sofern nicht anders angegeben, sind die Inhalte dieser Seite unter der Creative Commons Attribution 4.0 License und Codebeispiele unter der Apache 2.0 License lizenziert. Weitere Informationen finden Sie in den Websiterichtlinien von Google Developers. Java ist eine eingetragene Marke von Oracle und/oder seinen Partnern.
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Schwer verständlich","hardToUnderstand","thumb-down"],["Informationen oder Beispielcode falsch","incorrectInformationOrSampleCode","thumb-down"],["Benötigte Informationen/Beispiele nicht gefunden","missingTheInformationSamplesINeed","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],[],[[["\u003cp\u003eThis page demonstrates how to conditionally update a Firestore document within a transaction, ensuring data integrity.\u003c/p\u003e\n"],["\u003cp\u003eThe code examples illustrate how to increase a city's population count only if the new population remains under 1,000,000.\u003c/p\u003e\n"],["\u003cp\u003eTransactions are used to perform operations, guaranteeing that the update is only committed if the specified condition is met, preventing updates that exceed a certain population.\u003c/p\u003e\n"],["\u003cp\u003eThe provided examples showcase implementations in various programming languages including C#, Go, Java, Node.js, PHP, Python, and Ruby.\u003c/p\u003e\n"],["\u003cp\u003eEach language example starts by setting up the credentials for a Firestore connection and then show cases the transaction needed for the update.\u003c/p\u003e\n"]]],[],null,["# Conditionally 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 bool transactionResult = await db.RunTransactionAsync(async transaction =\u003e\n {\n DocumentSnapshot snapshot = await transaction.GetSnapshotAsync(cityRef);\n long newPopulation = snapshot.GetValue\u003clong\u003e(\"Population\") + 1;\n if (newPopulation \u003c= 1000000)\n {\n Dictionary\u003cstring, object\u003e updates = new Dictionary\u003cstring, object\u003e\n {\n { \"Population\", newPopulation}\n };\n transaction.Update(cityRef, updates);\n return true;\n }\n else\n {\n return false;\n }\n });\n\n if (transactionResult)\n {\n Console.WriteLine(\"Population updated successfully.\");\n }\n else\n {\n Console.WriteLine(\"Sorry! Population is too big.\");\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\"errors\"\n \t\"log\"\n\n \t\"cloud.google.com/go/firestore\"\n )\n\n func infoTransaction(ctx context.Context, client *firestore.Client) (int64, error) {\n \tvar updatedPop int64\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)\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\tnewpop := pop.(int64) + 1\n \t\tif newpop \u003c= 1000000 {\n \t\t\terr := tx.Set(ref, map[string]interface{}{\n \t\t\t\t\"population\": newpop,\n \t\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\t\tif err == nil {\n \t\t\t\tupdatedPop = newpop\n \t\t\t}\n \t\t\treturn err\n \t\t}\n \t\treturn errors.New(\"population is too big\")\n \t})\n \tif err != nil {\n \t\t// Handle any errors in an appropriate way, such as returning them.\n \t\tlog.Printf(\"An error has occurred: %s\", err)\n \t}\n \treturn updatedPop, 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 final DocumentReference docRef = db.collection(\"cities\").document(\"SF\");\n ApiFuture\u003cString\u003e futureTransaction =\n db.runTransaction(\n transaction -\u003e {\n DocumentSnapshot snapshot = transaction.get(docRef).get();\n Long newPopulation = snapshot.getLong(\"population\") + 1;\n // conditionally update based on current population\n if (newPopulation \u003c= 1000000L) {\n transaction.update(docRef, \"population\", newPopulation);\n return \"Population increased to \" + newPopulation;\n } else {\n throw new Exception(\"Sorry! Population is too big.\");\n }\n });\n // Print information retrieved from transaction\n System.out.println(futureTransaction.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 const cityRef = db.collection('cities').doc('SF');\n try {\n const res = await db.runTransaction(async t =\u003e {\n const doc = await t.get(cityRef);\n const newPopulation = doc.data().population + 1;\n if (newPopulation \u003c= 1000000) {\n await t.update(cityRef, { population: newPopulation });\n return `Population increased to ${newPopulation}`;\n } else {\n throw 'Sorry! Population is too big.';\n }\n });\n console.log('Transaction success', res);\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 $transactionResult = $db-\u003erunTransaction(function (Transaction $transaction) use ($cityRef) {\n $snapshot = $transaction-\u003esnapshot($cityRef);\n $newPopulation = $snapshot['population'] + 1;\n if ($newPopulation \u003c= 1000000) {\n $transaction-\u003eupdate($cityRef, [\n ['path' =\u003e 'population', 'value' =\u003e $newPopulation]\n ]);\n return true;\n } else {\n return false;\n }\n });\n\n if ($transactionResult) {\n printf('Population updated successfully.' . PHP_EOL);\n } else {\n printf('Sorry! Population is too big.' . PHP_EOL);\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 new_population = snapshot.get(\"population\") + 1\n\n if new_population \u003c 1000000:\n transaction.update(city_ref, {\"population\": new_population})\n return True\n else:\n return False\n\n result = update_in_transaction(transaction, city_ref)\n if result:\n print(\"Population updated\")\n else:\n print(\"Sorry! Population is too big.\")\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 updated = firestore.transaction do |tx|\n new_population = tx.get(city_ref).data[:population] + 1\n if new_population \u003c 1_000_000\n tx.update city_ref, { population: new_population }\n true\n end\n end\n\n if updated\n puts \"Population updated!\"\n else\n puts \"Sorry! Population is too big.\"\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)."]]