在事务中更新 Firestore 文档
深入探索
如需查看包含此代码示例的详细文档,请参阅以下内容:
代码示例
Go
ref := client.Collection("cities").Doc("SF")
err := client.RunTransaction(ctx, func(ctx context.Context, tx *firestore.Transaction) error {
doc, err := tx.Get(ref) // tx.Get, NOT ref.Get!
if err != nil {
return err
}
pop, err := doc.DataAt("population")
if err != nil {
return err
}
return tx.Set(ref, map[string]interface{}{
"population": pop.(int64) + 1,
}, firestore.MergeAll)
})
if err != nil {
// Handle any errors appropriately in this section.
log.Printf("An error has occurred: %s", err)
}
Java
// Initialize doc
final DocumentReference docRef = db.collection("cities").document("SF");
City city = new City("SF");
city.setCountry("USA");
city.setPopulation(860000L);
docRef.set(city).get();
// run an asynchronous transaction
ApiFuture<Void> futureTransaction =
db.runTransaction(
transaction -> {
// retrieve document and increment population field
DocumentSnapshot snapshot = transaction.get(docRef).get();
long oldPopulation = snapshot.getLong("population");
transaction.update(docRef, "population", oldPopulation + 1);
return null;
});
// block on transaction operation using transaction.get()
Node.js
// Initialize document
const cityRef = db.collection('cities').doc('SF');
await cityRef.set({
name: 'San Francisco',
state: 'CA',
country: 'USA',
capital: false,
population: 860000
});
try {
await db.runTransaction(async (t) => {
const doc = await t.get(cityRef);
// Add one person to the city population.
// Note: this could be done without a transaction
// by updating the population using FieldValue.increment()
const newPopulation = doc.data().population + 1;
t.update(cityRef, {population: newPopulation});
});
console.log('Transaction success!');
} catch (e) {
console.log('Transaction failure:', e);
}
PHP
$cityRef = $db->collection('samples/php/cities')->document('SF');
$db->runTransaction(function (Transaction $transaction) use ($cityRef) {
$snapshot = $transaction->snapshot($cityRef);
$newPopulation = $snapshot['population'] + 1;
$transaction->update($cityRef, [
['path' => 'population', 'value' => $newPopulation]
]);
});
Python
transaction = db.transaction()
city_ref = db.collection(u'cities').document(u'SF')
@firestore.transactional
def update_in_transaction(transaction, city_ref):
snapshot = city_ref.get(transaction=transaction)
transaction.update(city_ref, {
u'population': snapshot.get(u'population') + 1
})
update_in_transaction(transaction, city_ref)
Ruby
city_ref = firestore.doc "#{collection_path}/SF"
firestore.transaction do |tx|
new_population = tx.get(city_ref).data[:population] + 1
puts "New population is #{new_population}."
tx.update city_ref, { population: new_population }
end
后续步骤
如需搜索并过滤其他 Google Cloud 产品的代码示例,请参阅 Google Cloud 示例浏览器。