Class: Google::Cloud::Firestore::Client
- Inherits:
-
Object
- Object
- Google::Cloud::Firestore::Client
- Defined in:
- lib/google/cloud/firestore/client.rb
Overview
Client
The Cloud Firestore Client used is to access and manipulate the collections and documents in the Firestore database.
Access collapse
-
#col(collection_path) ⇒ CollectionReference
(also: #collection)
Retrieves a collection.
-
#col_group(collection_id) ⇒ CollectionGroup
(also: #collection_group)
Creates and returns a new collection group that includes all documents in the database that are contained in a collection or subcollection with the given collection_id.
-
#cols(read_time: nil) {|collections| ... } ⇒ Enumerator<CollectionReference>
(also: #collections, #list_collections)
Retrieves an enumerator for the root collections.
-
#doc(document_path) ⇒ DocumentReference
(also: #document)
Retrieves a document reference.
-
#document_id ⇒ FieldPath
Creates a field path object representing the sentinel ID of a document.
-
#field_array_delete(*values) ⇒ FieldValue
Creates a sentinel value to indicate the removal of the given values with an array.
-
#field_array_union(*values) ⇒ FieldValue
Creates a sentinel value to indicate the union of the given values with an array.
-
#field_delete ⇒ FieldValue
Creates a field value object representing the deletion of a field in document data.
-
#field_increment(value) ⇒ FieldValue
Creates a sentinel value to indicate the addition the given value to the field's current value.
-
#field_maximum(value) ⇒ FieldValue
Creates a sentinel value to indicate the setting the field to the maximum of its current value and the given value.
-
#field_minimum(value) ⇒ FieldValue
Creates a sentinel value to indicate the setting the field to the minimum of its current value and the given value.
-
#field_path(*fields) ⇒ FieldPath
Creates a field path object representing a nested field for document data.
-
#field_server_time ⇒ FieldValue
Creates a field value object representing set a field's value to the server timestamp when accessing the document data.
-
#filter(field, operator, value) ⇒ Google::Cloud::Firestore::Filter
Creates a filter object.
-
#get_all(*docs, field_mask: nil, read_time: nil) {|documents| ... } ⇒ Enumerator<DocumentSnapshot>
(also: #get_docs, #get_documents, #find)
Retrieves a list of document snapshots.
Operations collapse
-
#batch {|batch| ... } ⇒ CommitResponse
Perform multiple changes at the same time.
-
#bulk_writer(request_threads: nil, batch_threads: nil, retries: nil) ⇒ Google::Cloud::Firestore::BulkWriter
Create a bulk writer to perform multiple writes that are executed parallely.
-
#read_only_transaction(read_time: nil) {|transaction| ... } ⇒ Object
Create a transaction to perform multiple reads that are executed atomically at a single logical point in time in a database.
-
#transaction(max_retries: nil, commit_response: nil) {|transaction| ... } ⇒ Object, CommitResponse
Create a transaction to perform multiple reads and writes that are executed atomically at a single logical point in time in a database.
Instance Method Summary collapse
-
#database_id ⇒ String
The database identifier for the Cloud Firestore database.
-
#project_id ⇒ String
The project identifier for the Cloud Firestore database.
Instance Method Details
#batch {|batch| ... } ⇒ CommitResponse
Perform multiple changes at the same time.
All changes are accumulated in memory until the block completes. Unlike transactions, batches don't lock on document reads, should only fail if users provide preconditions, and are not automatically retried. See Batch.
652 653 654 655 656 |
# File 'lib/google/cloud/firestore/client.rb', line 652 def batch batch = Batch.from_client self yield batch batch.commit end |
#bulk_writer(request_threads: nil, batch_threads: nil, retries: nil) ⇒ Google::Cloud::Firestore::BulkWriter
Create a bulk writer to perform multiple writes that are executed parallely.
be retried (with exponential delay) before being marked as failure. Max attempts are 15. Optional
817 818 819 820 |
# File 'lib/google/cloud/firestore/client.rb', line 817 def bulk_writer request_threads: nil, batch_threads: nil, retries: nil BulkWriter.new self, @service, request_threads: request_threads, batch_threads: batch_threads, retries: retries end |
#col(collection_path) ⇒ CollectionReference Also known as: collection
Retrieves a collection.
149 150 151 152 153 154 155 |
# File 'lib/google/cloud/firestore/client.rb', line 149 def col collection_path if collection_path.to_s.split("/").count.even? raise ArgumentError, "collection_path must refer to a collection." end CollectionReference.from_path "#{path}/documents/#{collection_path}", self end |
#col_group(collection_id) ⇒ CollectionGroup Also known as: collection_group
Creates and returns a new collection group that includes all documents in the database that are contained in a collection or subcollection with the given collection_id.
181 182 183 184 185 186 187 |
# File 'lib/google/cloud/firestore/client.rb', line 181 def col_group collection_id if collection_id.include? "/" raise ArgumentError, "Invalid collection_id: '#{collection_id}', must not contain '/'." end CollectionGroup.from_collection_id service.documents_path, collection_id, self end |
#cols(read_time: nil) {|collections| ... } ⇒ Enumerator<CollectionReference> Also known as: collections, list_collections
Retrieves an enumerator for the root collections.
120 121 122 123 124 125 126 |
# File 'lib/google/cloud/firestore/client.rb', line 120 def cols read_time: nil, &block ensure_service! grpc = service.list_collections "#{path}/documents", read_time: read_time cols_enum = CollectionReferenceList.from_grpc(grpc, self, "#{path}/documents", read_time: read_time).all cols_enum.each(&block) if block_given? cols_enum end |
#database_id ⇒ String
The database identifier for the Cloud Firestore database.
73 74 75 |
# File 'lib/google/cloud/firestore/client.rb', line 73 def database_id service.database end |
#doc(document_path) ⇒ DocumentReference Also known as: document
Retrieves a document reference.
258 259 260 261 262 263 264 265 266 |
# File 'lib/google/cloud/firestore/client.rb', line 258 def doc document_path if document_path.to_s.split("/").count.odd? raise ArgumentError, "document_path must refer to a document." end doc_path = "#{path}/documents/#{document_path}" DocumentReference.from_path doc_path, self end |
#document_id ⇒ FieldPath
Creates a field path object representing the sentinel ID of a document. It can be used in queries to sort or filter by the document ID. See FieldPath.document_id.
381 382 383 |
# File 'lib/google/cloud/firestore/client.rb', line 381 def document_id FieldPath.document_id end |
#field_array_delete(*values) ⇒ FieldValue
Creates a sentinel value to indicate the removal of the given values with an array.
497 498 499 |
# File 'lib/google/cloud/firestore/client.rb', line 497 def field_array_delete *values FieldValue.array_delete(*values) end |
#field_array_union(*values) ⇒ FieldValue
Creates a sentinel value to indicate the union of the given values with an array.
472 473 474 |
# File 'lib/google/cloud/firestore/client.rb', line 472 def field_array_union *values FieldValue.array_union(*values) end |
#field_delete ⇒ FieldValue
Creates a field value object representing the deletion of a field in document data.
426 427 428 |
# File 'lib/google/cloud/firestore/client.rb', line 426 def field_delete FieldValue.delete end |
#field_increment(value) ⇒ FieldValue
Creates a sentinel value to indicate the addition the given value to the field's current value.
If the field's current value is not an integer or a double value (Numeric), or if the field does not yet exist, the transformation will set the field to the given value. If either of the given value or the current field value are doubles, both values will be interpreted as doubles. Double arithmetic and representation of double values follow IEEE 754 semantics. If there is positive/negative integer overflow, the field is resolved to the largest magnitude positive/negative integer.
534 535 536 |
# File 'lib/google/cloud/firestore/client.rb', line 534 def field_increment value FieldValue.increment value end |
#field_maximum(value) ⇒ FieldValue
Creates a sentinel value to indicate the setting the field to the maximum of its current value and the given value.
If the field is not an integer or double (Numeric), or if the field does not yet exist, the transformation will set the field to the given value. If a maximum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the larger operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and zero input value is always the stored value. The maximum of any numeric value x and NaN is NaN.
573 574 575 |
# File 'lib/google/cloud/firestore/client.rb', line 573 def field_maximum value FieldValue.maximum value end |
#field_minimum(value) ⇒ FieldValue
Creates a sentinel value to indicate the setting the field to the minimum of its current value and the given value.
If the field is not an integer or double (Numeric), or if the field does not yet exist, the transformation will set the field to the input value. If a minimum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the smaller operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and zero input value is always the stored value. The minimum of any numeric value x and NaN is NaN.
612 613 614 |
# File 'lib/google/cloud/firestore/client.rb', line 612 def field_minimum value FieldValue.minimum value end |
#field_path(*fields) ⇒ FieldPath
Creates a field path object representing a nested field for document data.
405 406 407 |
# File 'lib/google/cloud/firestore/client.rb', line 405 def field_path *fields FieldPath.new(*fields) end |
#field_server_time ⇒ FieldValue
Creates a field value object representing set a field's value to the server timestamp when accessing the document data.
447 448 449 |
# File 'lib/google/cloud/firestore/client.rb', line 447 def field_server_time FieldValue.server_time end |
#filter(field, operator, value) ⇒ Google::Cloud::Firestore::Filter
Creates a filter object.
236 237 238 |
# File 'lib/google/cloud/firestore/client.rb', line 236 def filter field, operator, value Filter.new field, operator, value end |
#get_all(*docs, field_mask: nil, read_time: nil) {|documents| ... } ⇒ Enumerator<DocumentSnapshot> Also known as: get_docs, get_documents, find
Retrieves a list of document snapshots.
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 |
# File 'lib/google/cloud/firestore/client.rb', line 329 def get_all *docs, field_mask: nil, read_time: nil ensure_service! unless block_given? return enum_for :get_all, *docs, field_mask: field_mask, read_time: read_time end doc_paths = Array(docs).flatten.map do |doc_path| coalesce_doc_path_argument doc_path end mask = Array(field_mask).map do |field_path| if field_path.is_a? FieldPath field_path.formatted_string else FieldPath.parse(field_path).formatted_string end end mask = nil if mask.empty? results = service.get_documents doc_paths, mask: mask, read_time: read_time results.each do |result| next if result.result.nil? yield DocumentSnapshot.from_batch_result result, self end end |
#project_id ⇒ String
The project identifier for the Cloud Firestore database.
65 66 67 |
# File 'lib/google/cloud/firestore/client.rb', line 65 def project_id service.project end |
#read_only_transaction(read_time: nil) {|transaction| ... } ⇒ Object
Create a transaction to perform multiple reads that are executed atomically at a single logical point in time in a database.
All changes are accumulated in memory until the block completes. Transactions will be automatically retried when documents change before the transaction is committed. See Transaction.
788 789 790 791 |
# File 'lib/google/cloud/firestore/client.rb', line 788 def read_only_transaction read_time: nil transaction = Transaction.from_client self, read_time: read_time, read_only: true yield transaction end |
#transaction(max_retries: nil, commit_response: nil) {|transaction| ... } ⇒ Object, CommitResponse
Create a transaction to perform multiple reads and writes that are executed atomically at a single logical point in time in a database.
All changes are accumulated in memory until the block completes. Transactions will be automatically retried when documents change before the transaction is committed. See Transaction.
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 |
# File 'lib/google/cloud/firestore/client.rb', line 701 def transaction max_retries: nil, commit_response: nil max_retries = 5 unless max_retries.is_a? Integer backoff = { current: 0, delay: 1.0, max: max_retries, mod: 1.3 } transaction = Transaction.from_client self begin transaction_return = yield transaction commit_return = transaction.commit # Conditional return value, depending on truthy commit_response commit_response ? commit_return : transaction_return rescue Google::Cloud::AbortedError, Google::Cloud::CanceledError, Google::Cloud::UnknownError, Google::Cloud::DeadlineExceededError, Google::Cloud::InternalError, Google::Cloud::UnauthenticatedError, Google::Cloud::ResourceExhaustedError, Google::Cloud::UnavailableError, Google::Cloud::InvalidArgumentError => e if e.instance_of? Google::Cloud::InvalidArgumentError # Return if a previous call was retried but ultimately succeeded return nil if backoff[:current].positive? # The Firestore backend uses "INVALID_ARGUMENT" for transaction IDs that have expired. # While INVALID_ARGUMENT is generally not retryable, we retry this specific case. raise e unless e. =~ /transaction has expired/ end # Re-raise if retried more than the max raise e if backoff[:current] > backoff[:max] # Sleep with incremental backoff before restarting sleep backoff[:delay] # Update increment backoff delay and retry counter backoff[:delay] *= backoff[:mod] backoff[:current] += 1 # Create new transaction and retry transaction = Transaction.from_client \ self, previous_transaction: transaction.transaction_id retry rescue StandardError => e # Rollback transaction when handling unexpected error transaction.rollback rescue nil # Re-raise error. raise e end end |