Reference documentation and code samples for the Cloud Firestore API class Google::Cloud::Firestore::Transaction.
Transaction
A transaction in Cloud Firestore is a set of reads and writes that execute atomically at a single logical point in time.
All changes are accumulated in memory until the block passed to Client#transaction completes. Transactions will be automatically retried when documents change before the transaction is committed. See Client#transaction.
Inherits
- Object
Example
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new city = firestore.col("cities").doc("SF") city.set({ name: "San Francisco", state: "CA", country: "USA", capital: false, population: 860000 }) firestore.transaction do |tx| new_population = tx.get(city).data[:population] + 1 tx.update(city, { population: new_population }) end
Methods
#client
def client() -> Client
The client the Cloud Firestore transaction belongs to.
- (Client) — firestore client.
#create
def create(doc, data)
Creates a document with the provided data (fields and values).
The operation will fail if the document already exists.
- doc (String, DocumentReference) — A string representing the path of the document, or a document reference object.
- data (Hash) — The document's fields and values.
Create a document using a document path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| tx.create("cities/NYC", { name: "New York City" }) end
Create a document using a document reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" firestore.transaction do |tx| tx.create(nyc_ref, { name: "New York City" }) end
Create a document and set a field to server_time:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" firestore.transaction do |tx| tx.create(nyc_ref, { name: "New York City", updated_at: firestore.field_server_time }) end
#delete
def delete(doc, exists: nil, update_time: nil)
Deletes a document from the database.
- doc (String, DocumentReference) — A string representing the path of the document, or a document reference object.
-
exists (Boolean) (defaults to: nil) — Whether the document must exist. When
true
, the document must exist or an error is raised. Default isfalse
. Optional. - update_time (Time) (defaults to: nil) — When set, the document must have been last updated at that time. Optional.
Delete a document using a document path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Delete a document tx.delete "cities/NYC" end
Delete a document using a document reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" firestore.transaction do |tx| # Delete a document tx.delete nyc_ref end
Delete a document using exists
:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Delete a document tx.delete "cities/NYC", exists: true end
Delete a document using the update_time
precondition:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new last_updated_at = Time.now - 42 # 42 seconds ago firestore.transaction do |tx| # Delete a document tx.delete "cities/NYC", update_time: last_updated_at end
#find
def find(*docs, field_mask: nil) { |document| ... } -> Enumerator<DocumentSnapshot>
Retrieves a list of document snapshots.
- docs (String, DocumentReference, Array<String|DocumentReference>) — One or more strings representing the path of the document, or document reference objects.
-
field_mask (Array<String|FieldPath>) (defaults to: nil) — One or more field path
values, representing the fields of the document to be returned. If a
document has a field that is not present in this mask, that field
will not be returned in the response. All fields are returned when
the mask is not set.
A field path can either be a FieldPath object, or a dotted string representing the nested fields. In other words the string represents individual fields joined by ".". Fields containing
~
,*
,/
,[
,]
, and.
cannot be in a dotted string, and should provided using a FieldPath object instead. See Client#field_path.)
- (documents) — The block for accessing the document snapshots.
- document (DocumentSnapshot) — A document snapshot.
- (Enumerator<DocumentSnapshot>) — document snapshots list.
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents tx.get_all("cities/NYC", "cities/SF", "cities/LA").each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
Get docs using a field mask:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents cities = ["cities/NYC", "cities/SF", "cities/LA"] tx.get_all(*cities, field_mask: :population).each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
#firestore
def firestore() -> Client
The client the Cloud Firestore transaction belongs to.
- (Client) — firestore client.
#get
def get(obj) { |document| ... } -> DocumentSnapshot, Enumerator<DocumentSnapshot>
Retrieves document snapshots for the given value. Valid values can be a string representing either a document or a collection of documents, a document reference object, a collection reference object, or a query to be run.
- obj (String, DocumentReference, CollectionReference, Query) — A string representing the path of a document or collection, a document reference object, a collection reference object, or a query to run.
- (documents) — The block for accessing the document snapshots.
- document (DocumentSnapshot) — A document snapshot.
- (DocumentSnapshot, Enumerator<DocumentSnapshot>) — A single document snapshot when passed a document path or a document reference object, or a list of document snapshots when passed other valid values.
Get a document snapshot given a document path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get a document snapshot nyc_snap = tx.get "cities/NYC" end
Get a document snapshot given a document reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" firestore.transaction do |tx| # Get a document snapshot nyc_snap = tx.get nyc_ref end
Get document snapshots given a collection path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get documents for a collection path tx.get("cities").each do |city| # Update the city population by 1 tx.update(city, { population: city[:population] + 1}) end end
Get document snapshots given a collection reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a collection reference cities_col = firestore.col :cities firestore.transaction do |tx| # Get documents for a collection tx.get(cities_col).each do |city| # Update the city population by 1 tx.update(city, { population: city[:population] + 1}) end end
Get document snapshots given a query:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Create a query query = firestore.col(:cities).select(:population) firestore.transaction do |tx| # Get/run a query tx.get(query).each do |city| # Update the city population by 1 tx.update(city, { population: city[:population] + 1}) end end
#get_all
def get_all(*docs, field_mask: nil) { |document| ... } -> Enumerator<DocumentSnapshot>
Retrieves a list of document snapshots.
- docs (String, DocumentReference, Array<String|DocumentReference>) — One or more strings representing the path of the document, or document reference objects.
-
field_mask (Array<String|FieldPath>) (defaults to: nil) — One or more field path
values, representing the fields of the document to be returned. If a
document has a field that is not present in this mask, that field
will not be returned in the response. All fields are returned when
the mask is not set.
A field path can either be a FieldPath object, or a dotted string representing the nested fields. In other words the string represents individual fields joined by ".". Fields containing
~
,*
,/
,[
,]
, and.
cannot be in a dotted string, and should provided using a FieldPath object instead. See Client#field_path.)
- (documents) — The block for accessing the document snapshots.
- document (DocumentSnapshot) — A document snapshot.
- (Enumerator<DocumentSnapshot>) — document snapshots list.
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents tx.get_all("cities/NYC", "cities/SF", "cities/LA").each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
Get docs using a field mask:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents cities = ["cities/NYC", "cities/SF", "cities/LA"] tx.get_all(*cities, field_mask: :population).each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
#get_docs
def get_docs(*docs, field_mask: nil) { |document| ... } -> Enumerator<DocumentSnapshot>
Retrieves a list of document snapshots.
- docs (String, DocumentReference, Array<String|DocumentReference>) — One or more strings representing the path of the document, or document reference objects.
-
field_mask (Array<String|FieldPath>) (defaults to: nil) — One or more field path
values, representing the fields of the document to be returned. If a
document has a field that is not present in this mask, that field
will not be returned in the response. All fields are returned when
the mask is not set.
A field path can either be a FieldPath object, or a dotted string representing the nested fields. In other words the string represents individual fields joined by ".". Fields containing
~
,*
,/
,[
,]
, and.
cannot be in a dotted string, and should provided using a FieldPath object instead. See Client#field_path.)
- (documents) — The block for accessing the document snapshots.
- document (DocumentSnapshot) — A document snapshot.
- (Enumerator<DocumentSnapshot>) — document snapshots list.
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents tx.get_all("cities/NYC", "cities/SF", "cities/LA").each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
Get docs using a field mask:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents cities = ["cities/NYC", "cities/SF", "cities/LA"] tx.get_all(*cities, field_mask: :population).each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
#get_documents
def get_documents(*docs, field_mask: nil) { |document| ... } -> Enumerator<DocumentSnapshot>
Retrieves a list of document snapshots.
- docs (String, DocumentReference, Array<String|DocumentReference>) — One or more strings representing the path of the document, or document reference objects.
-
field_mask (Array<String|FieldPath>) (defaults to: nil) — One or more field path
values, representing the fields of the document to be returned. If a
document has a field that is not present in this mask, that field
will not be returned in the response. All fields are returned when
the mask is not set.
A field path can either be a FieldPath object, or a dotted string representing the nested fields. In other words the string represents individual fields joined by ".". Fields containing
~
,*
,/
,[
,]
, and.
cannot be in a dotted string, and should provided using a FieldPath object instead. See Client#field_path.)
- (documents) — The block for accessing the document snapshots.
- document (DocumentSnapshot) — A document snapshot.
- (Enumerator<DocumentSnapshot>) — document snapshots list.
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents tx.get_all("cities/NYC", "cities/SF", "cities/LA").each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
Get docs using a field mask:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get and print city documents cities = ["cities/NYC", "cities/SF", "cities/LA"] tx.get_all(*cities, field_mask: :population).each do |city| puts "#{city.document_id} has #{city[:population]} residents." end end
#run
def run(obj) { |document| ... } -> DocumentSnapshot, Enumerator<DocumentSnapshot>
Retrieves document snapshots for the given value. Valid values can be a string representing either a document or a collection of documents, a document reference object, a collection reference object, or a query to be run.
- obj (String, DocumentReference, CollectionReference, Query) — A string representing the path of a document or collection, a document reference object, a collection reference object, or a query to run.
- (documents) — The block for accessing the document snapshots.
- document (DocumentSnapshot) — A document snapshot.
- (DocumentSnapshot, Enumerator<DocumentSnapshot>) — A single document snapshot when passed a document path or a document reference object, or a list of document snapshots when passed other valid values.
Get a document snapshot given a document path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get a document snapshot nyc_snap = tx.get "cities/NYC" end
Get a document snapshot given a document reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" firestore.transaction do |tx| # Get a document snapshot nyc_snap = tx.get nyc_ref end
Get document snapshots given a collection path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Get documents for a collection path tx.get("cities").each do |city| # Update the city population by 1 tx.update(city, { population: city[:population] + 1}) end end
Get document snapshots given a collection reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a collection reference cities_col = firestore.col :cities firestore.transaction do |tx| # Get documents for a collection tx.get(cities_col).each do |city| # Update the city population by 1 tx.update(city, { population: city[:population] + 1}) end end
Get document snapshots given a query:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Create a query query = firestore.col(:cities).select(:population) firestore.transaction do |tx| # Get/run a query tx.get(query).each do |city| # Update the city population by 1 tx.update(city, { population: city[:population] + 1}) end end
#set
def set(doc, data, merge: nil)
Writes the provided data (fields and values) to the provided document.
If the document does not exist, it will be created. By default, the
provided data overwrites existing data, but the provided data can be
merged into the existing document using the merge
argument.
If you're not sure whether the document exists, use the merge
argument to merge the new data with any existing document data to
avoid overwriting entire documents.
- doc (String, DocumentReference) — A string representing the path of the document, or a document reference object.
- data (Hash) — The document's fields and values.
-
merge (Boolean, FieldPath, String, Symbol) (defaults to: nil) — When
true
, all provided data is merged with the existing document data. When the argument is one or more field path, only the data for fields in this argument is merged with the existing document data. The default is to not merge, but to instead overwrite the existing document data.
Set a document using a document path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| # Update a document tx.set("cities/NYC", { name: "New York City" }) end
Create a document using a document reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" firestore.transaction do |tx| # Update a document tx.set(nyc_ref, { name: "New York City" }) end
Set a document and merge all data:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| tx.set("cities/NYC", { name: "New York City" }, merge: true) end
Set a document and merge only name:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| tx.set("cities/NYC", { name: "New York City" }, merge: :name) end
Set a document and deleting a field using merge:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" nyc_data = { name: "New York City", trash: firestore.field_delete } firestore.transaction do |tx| tx.set(nyc_ref, nyc_data, merge: true) end
Set a document and set a field to server_time:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" nyc_data = { name: "New York City", updated_at: firestore.field_server_time } firestore.transaction do |tx| tx.set(nyc_ref, nyc_data, merge: true) end
#transaction_id
def transaction_id() -> String
The transaction identifier.
- (String) — transaction identifier.
#update
def update(doc, data, update_time: nil)
Updates the document with the provided data (fields and values). The provided data is merged into the existing document data.
The operation will fail if the document does not exist.
- doc (String, DocumentReference) — A string representing the path of the document, or a document reference object.
-
data (Hash<FieldPath|String|Symbol, Object>) — The document's
fields and values.
The top-level keys in the data hash are considered field paths, and can either be a FieldPath object, or a string representing the nested fields. In other words the string represents individual fields joined by ".". Fields containing
~
,*
,/
,[
,]
, and.
cannot be in a dotted string, and should provided using a FieldPath object instead. - update_time (Time) (defaults to: nil) — When set, the document must have been last updated at that time. Optional.
Update a document using a document path:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new firestore.transaction do |tx| tx.update("cities/NYC", { name: "New York City" }) end
Directly update a deeply-nested field with a FieldPath
:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new nested_field_path = firestore.field_path :favorites, :food firestore.transaction do |tx| tx.update("users/frank", { nested_field_path => "Pasta" }) end
Update a document using a document reference:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" firestore.transaction do |tx| tx.update(nyc_ref, { name: "New York City" }) end
Update a document using the update_time
precondition:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new last_updated_at = Time.now - 42 # 42 seconds ago firestore.transaction do |tx| tx.update("cities/NYC", { name: "New York City" }, update_time: last_updated_at) end
Update a document and deleting a field:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" nyc_data = { name: "New York City", trash: firestore.field_delete } firestore.transaction do |tx| tx.update(nyc_ref, nyc_data) end
Update a document and set a field to server_time:
require "google/cloud/firestore" firestore = Google::Cloud::Firestore.new # Get a document reference nyc_ref = firestore.doc "cities/NYC" nyc_data = { name: "New York City", updated_at: firestore.field_server_time } firestore.transaction do |tx| tx.update(nyc_ref, nyc_data) end