トランザクションでの Firestore ドキュメントの条件付き更新
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
トランザクションでの Firestore ドキュメントの条件付き更新
もっと見る
このコードサンプルを含む詳細なドキュメントについては、以下をご覧ください。
コードサンプル
C#
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Java
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
PHP
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
特に記載のない限り、このページのコンテンツはクリエイティブ・コモンズの表示 4.0 ライセンスにより使用許諾されます。コードサンプルは Apache 2.0 ライセンスにより使用許諾されます。詳しくは、Google Developers サイトのポリシーをご覧ください。Java は Oracle および関連会社の登録商標です。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["わかりにくい","hardToUnderstand","thumb-down"],["情報またはサンプルコードが不正確","incorrectInformationOrSampleCode","thumb-down"],["必要な情報 / サンプルがない","missingTheInformationSamplesINeed","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["その他","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)."]]