firestore/cloud-client/snippets.py (628 lines of code) (raw):
# Copyright 2017 Google, LLC.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import datetime
import threading
from time import sleep
from google.api_core.client_options import ClientOptions
from google.cloud import firestore
from google.cloud.firestore_v1.base_query import FieldFilter
def quickstart_new_instance():
# [START firestore_setup_client_create]
# [START firestore_setup_client_create_with_project_id]
from google.cloud import firestore
# The `project` parameter is optional and represents which project the client
# will act on behalf of. If not supplied, the client falls back to the default
# project inferred from the environment.
db = firestore.Client(project="my-project-id")
# [END firestore_setup_client_create_with_project_id]
# [END firestore_setup_client_create]
return db
def quickstart_add_data_one():
db = firestore.Client()
# [START firestore_setup_dataset_pt1]
doc_ref = db.collection("users").document("alovelace")
doc_ref.set({"first": "Ada", "last": "Lovelace", "born": 1815})
# [END firestore_setup_dataset_pt1]
def quickstart_add_data_two():
db = firestore.Client()
# [START firestore_setup_dataset_pt2]
doc_ref = db.collection("users").document("aturing")
doc_ref.set({"first": "Alan", "middle": "Mathison", "last": "Turing", "born": 1912})
# [END firestore_setup_dataset_pt2]
def quickstart_get_collection():
db = firestore.Client()
# [START firestore_setup_dataset_read]
users_ref = db.collection("users")
docs = users_ref.stream()
for doc in docs:
print(f"{doc.id} => {doc.to_dict()}")
# [END firestore_setup_dataset_read]
def add_from_dict():
db = firestore.Client()
# [START firestore_data_set_from_map]
data = {"name": "Los Angeles", "state": "CA", "country": "USA"}
# Add a new doc in collection 'cities' with ID 'LA'
db.collection("cities").document("LA").set(data)
# [END firestore_data_set_from_map]
def add_data_types():
db = firestore.Client()
# [START firestore_data_set_from_map_nested]
data = {
"stringExample": "Hello, World!",
"booleanExample": True,
"numberExample": 3.14159265,
"dateExample": datetime.datetime.now(tz=datetime.timezone.utc),
"arrayExample": [5, True, "hello"],
"nullExample": None,
"objectExample": {"a": 5, "b": True},
}
db.collection("data").document("one").set(data)
# [END firestore_data_set_from_map_nested]
# [START firestore_data_custom_type_definition]
class City:
def __init__(self, name, state, country, capital=False, population=0, regions=[]):
self.name = name
self.state = state
self.country = country
self.capital = capital
self.population = population
self.regions = regions
@staticmethod
def from_dict(source):
# [START_EXCLUDE]
city = City(source["name"], source["state"], source["country"])
if "capital" in source:
city.capital = source["capital"]
if "population" in source:
city.population = source["population"]
if "regions" in source:
city.regions = source["regions"]
return city
# [END_EXCLUDE]
def to_dict(self):
# [START_EXCLUDE]
dest = {"name": self.name, "state": self.state, "country": self.country}
if self.capital:
dest["capital"] = self.capital
if self.population:
dest["population"] = self.population
if self.regions:
dest["regions"] = self.regions
return dest
# [END_EXCLUDE]
def __repr__(self):
return f"City(\
name={self.name}, \
country={self.country}, \
population={self.population}, \
capital={self.capital}, \
regions={self.regions}\
)"
# [END firestore_data_custom_type_definition]
def add_example_data():
db = firestore.Client()
# [START firestore_data_get_dataset]
cities_ref = db.collection("cities")
cities_ref.document("BJ").set(
City("Beijing", None, "China", True, 21500000, ["hebei"]).to_dict()
)
cities_ref.document("SF").set(
City(
"San Francisco", "CA", "USA", False, 860000, ["west_coast", "norcal"]
).to_dict()
)
cities_ref.document("LA").set(
City(
"Los Angeles", "CA", "USA", False, 3900000, ["west_coast", "socal"]
).to_dict()
)
cities_ref.document("DC").set(
City("Washington D.C.", None, "USA", True, 680000, ["east_coast"]).to_dict()
)
cities_ref.document("TOK").set(
City("Tokyo", None, "Japan", True, 9000000, ["kanto", "honshu"]).to_dict()
)
# [END firestore_data_get_dataset]
def add_custom_class_with_id():
db = firestore.Client()
# [START firestore_data_set_from_custom_type]
city = City(name="Los Angeles", state="CA", country="USA")
db.collection("cities").document("LA").set(city.to_dict())
# [END firestore_data_set_from_custom_type]
def add_data_with_id():
db = firestore.Client()
data = {}
# [START firestore_data_set_id_specified]
db.collection("cities").document("new-city-id").set(data)
# [END firestore_data_set_id_specified]
def add_custom_class_generated_id():
db = firestore.Client()
# [START firestore_data_set_id_random_collection]
city = {"name": "Tokyo", "country": "Japan"}
update_time, city_ref = db.collection("cities").add(city)
print(f"Added document with id {city_ref.id}")
# [END firestore_data_set_id_random_collection]
def add_new_doc():
db = firestore.Client()
# [START firestore_data_set_id_random_document_ref]
new_city_ref = db.collection("cities").document()
# later...
new_city_ref.set(
{
# ...
}
)
# [END firestore_data_set_id_random_document_ref]
def get_check_exists():
db = firestore.Client()
# [START firestore_data_get_as_map]
doc_ref = db.collection("cities").document("SF")
doc = doc_ref.get()
if doc.exists:
print(f"Document data: {doc.to_dict()}")
else:
print("No such document!")
# [END firestore_data_get_as_map]
def get_custom_class():
db = firestore.Client()
# [START firestore_data_get_as_custom_type]
doc_ref = db.collection("cities").document("BJ")
doc = doc_ref.get()
city = City.from_dict(doc.to_dict())
print(city)
# [END firestore_data_get_as_custom_type]
def get_simple_query():
db = firestore.Client()
# [START firestore_data_query]
# Note: Use of CollectionRef stream() is prefered to get()
docs = (
db.collection("cities")
.where(filter=FieldFilter("capital", "==", True))
.stream()
)
for doc in docs:
print(f"{doc.id} => {doc.to_dict()}")
# [END firestore_data_query]
def array_contains_filter():
db = firestore.Client()
# [START firestore_query_filter_array_contains]
cities_ref = db.collection("cities")
query = cities_ref.where(
filter=FieldFilter("regions", "array_contains", "west_coast")
)
# [END firestore_query_filter_array_contains]
docs = query.stream()
for doc in docs:
print(f"{doc.id} => {doc.to_dict()}")
def get_full_collection():
db = firestore.Client()
# [START firestore_data_get_all_documents]
docs = db.collection("cities").stream()
for doc in docs:
print(f"{doc.id} => {doc.to_dict()}")
# [END firestore_data_get_all_documents]
def structure_doc_ref():
db = firestore.Client()
# [START firestore_data_reference_document]
a_lovelace_ref = db.collection("users").document("alovelace")
# [END firestore_data_reference_document]
print(a_lovelace_ref)
def structure_collection_ref():
db = firestore.Client()
# [START firestore_data_reference_collection]
users_ref = db.collection("users")
# [END firestore_data_reference_collection]
print(users_ref)
def structure_doc_ref_alternate():
db = firestore.Client()
# [START firestore_data_reference_document_path]
a_lovelace_ref = db.document("users/alovelace")
# [END firestore_data_reference_document_path]
return a_lovelace_ref
def structure_subcollection_ref():
db = firestore.Client()
# [START firestore_data_reference_subcollection]
room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
# [END firestore_data_reference_subcollection]
print(message_ref)
def update_doc():
db = firestore.Client()
db.collection("cities").document("DC").set(
City("Washington D.C.", None, "USA", True, 680000, ["east_coast"]).to_dict()
)
# [START firestore_data_set_field]
city_ref = db.collection("cities").document("DC")
# Set the capital field
city_ref.update({"capital": True})
# [END firestore_data_set_field]
def update_doc_array():
db = firestore.Client()
db.collection("cities").document("DC").set(
City("Washington D.C.", None, "USA", True, 680000, ["east_coast"]).to_dict()
)
# [START firestore_data_set_array_operations]
city_ref = db.collection("cities").document("DC")
# Atomically add a new region to the 'regions' array field.
city_ref.update({"regions": firestore.ArrayUnion(["greater_virginia"])})
# // Atomically remove a region from the 'regions' array field.
city_ref.update({"regions": firestore.ArrayRemove(["east_coast"])})
# [END firestore_data_set_array_operations]
city = city_ref.get()
print(f"Updated the regions field of the DC. {city.to_dict()}")
def update_multiple():
db = firestore.Client()
db.collection("cities").document("DC").set(
City("Washington D.C.", None, "USA", True, 680000, ["east_coast"]).to_dict()
)
# [START firestore_update_multiple]
doc_ref = db.collection("cities").document("DC")
doc_ref.update({"name": "Washington D.C.", "country": "USA", "capital": True})
# [END firestore_update_multiple]
def update_create_if_missing():
db = firestore.Client()
# [START firestore_data_set_doc_upsert]
city_ref = db.collection("cities").document("BJ")
city_ref.set({"capital": True}, merge=True)
# [END firestore_data_set_doc_upsert]
def update_nested():
db = firestore.Client()
# [START firestore_data_set_nested_fields]
# Create an initial document to update
frank_ref = db.collection("users").document("frank")
frank_ref.set(
{
"name": "Frank",
"favorites": {"food": "Pizza", "color": "Blue", "subject": "Recess"},
"age": 12,
}
)
# Update age and favorite color
frank_ref.update({"age": 13, "favorites.color": "Red"})
# [END firestore_data_set_nested_fields]
def update_server_timestamp():
db = firestore.Client()
# [START firestore_data_set_server_timestamp]
city_ref = db.collection("objects").document("some-id")
city_ref.update({"timestamp": firestore.SERVER_TIMESTAMP})
# [END firestore_data_set_server_timestamp]
def update_data_transaction():
db = firestore.Client()
# [START firestore_transaction_document_update]
transaction = db.transaction()
city_ref = db.collection("cities").document("SF")
@firestore.transactional
def update_in_transaction(transaction, city_ref):
snapshot = city_ref.get(transaction=transaction)
transaction.update(city_ref, {"population": snapshot.get("population") + 1})
update_in_transaction(transaction, city_ref)
# [END firestore_transaction_document_update]
def update_data_transaction_result():
db = firestore.Client()
# [START firestore_transaction_document_update_conditional]
transaction = db.transaction()
city_ref = db.collection("cities").document("SF")
@firestore.transactional
def update_in_transaction(transaction, city_ref):
snapshot = city_ref.get(transaction=transaction)
new_population = snapshot.get("population") + 1
if new_population < 1000000:
transaction.update(city_ref, {"population": new_population})
return True
else:
return False
result = update_in_transaction(transaction, city_ref)
if result:
print("Population updated")
else:
print("Sorry! Population is too big.")
# [END firestore_transaction_document_update_conditional]
def update_data_batch():
db = firestore.Client()
# [START firestore_data_batch_writes]
batch = db.batch()
# Set the data for NYC
nyc_ref = db.collection("cities").document("NYC")
batch.set(nyc_ref, {"name": "New York City"})
# Update the population for SF
sf_ref = db.collection("cities").document("SF")
batch.update(sf_ref, {"population": 1000000})
# Delete DEN
den_ref = db.collection("cities").document("DEN")
batch.delete(den_ref)
# Commit the batch
batch.commit()
# [END firestore_data_batch_writes]
def compound_query_example():
db = firestore.Client()
# [START firestore_query_filter_eq_string]
# Create a reference to the cities collection
cities_ref = db.collection("cities")
# Create a query against the collection
query_ref = cities_ref.where(filter=FieldFilter("state", "==", "CA"))
# [END firestore_query_filter_eq_string]
return query_ref
def compound_query_simple():
db = firestore.Client()
# [START firestore_query_filter_eq_boolean]
cities_ref = db.collection("cities")
query = cities_ref.where(filter=FieldFilter("capital", "==", True))
# [END firestore_query_filter_eq_boolean]
print(query)
def compound_query_single_clause():
db = firestore.Client()
# [START firestore_query_filter_single_examples]
cities_ref = db.collection("cities")
cities_ref.where(filter=FieldFilter("state", "==", "CA"))
cities_ref.where(filter=FieldFilter("population", "<", 1000000))
cities_ref.where(filter=FieldFilter("name", ">=", "San Francisco"))
# [END firestore_query_filter_single_examples]
def compound_query_valid_multi_clause():
db = firestore.Client(
add_unique_string=False
) # Flag for testing purposes, needs index to be precreated
# [START firestore_query_filter_compound_multi_eq]
cities_ref = db.collection("cities")
denver_query = cities_ref.where(filter=FieldFilter("state", "==", "CO")).where(
filter=FieldFilter("name", "==", "Denver")
)
large_us_cities_query = cities_ref.where(
filter=FieldFilter("state", "==", "CA")
).where(filter=FieldFilter("population", ">", 1000000))
# [END firestore_query_filter_compound_multi_eq]
print(denver_query)
print(large_us_cities_query)
return denver_query, large_us_cities_query
def compound_query_valid_single_field():
db = firestore.Client()
# [START firestore_query_filter_range_valid]
cities_ref = db.collection("cities")
cities_ref.where(filter=FieldFilter("state", ">=", "CA")).where(
filter=FieldFilter("state", "<=", "IN")
)
# [END firestore_query_filter_range_valid]
def compound_query_invalid_multi_field():
db = firestore.Client()
# [START firestore_query_filter_range_invalid]
cities_ref = db.collection("cities")
cities_ref.where(filter=FieldFilter("state", ">=", "CA")).where(
filter=FieldFilter("population", ">=", 1000000)
)
# [END firestore_query_filter_range_invalid]
def order_simple_limit():
db = firestore.Client()
# [START firestore_order_simple_limit]
query = db.collection("cities").order_by("name").limit(3).stream()
# [END firestore_order_simple_limit]
return query
def order_simple_limit_desc():
db = firestore.Client()
# [START firestore_query_order_desc_limit]
cities_ref = db.collection("cities")
query = cities_ref.order_by("name", direction=firestore.Query.DESCENDING).limit(3)
results = query.stream()
# [END firestore_query_order_desc_limit]
print(results)
return results
def order_multiple():
db = firestore.Client(
add_unique_string=False
) # Flag for testing purposes, needs index to be precreated
# [START firestore_query_order_multi]
cities_ref = db.collection("cities")
ordered_city_ref = cities_ref.order_by("state").order_by(
"population", direction=firestore.Query.DESCENDING
)
# [END firestore_query_order_multi]
return ordered_city_ref
def order_where_limit():
db = firestore.Client()
# [START firestore_query_order_limit_field_valid]
cities_ref = db.collection("cities")
query = (
cities_ref.where(filter=FieldFilter("population", ">", 2500000))
.order_by("population")
.limit(2)
)
results = query.stream()
# [END firestore_query_order_limit_field_valid]
print(results)
return results
def order_limit_to_last():
db = firestore.Client()
# [START firestore_query_order_limit]
cities_ref = db.collection("cities")
query = cities_ref.order_by("name").limit_to_last(2)
results = query.get()
# [END firestore_query_order_limit]
print(results)
return results
def order_where_valid():
db = firestore.Client()
# [START firestore_query_order_with_filter]
cities_ref = db.collection("cities")
query = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
"population"
)
results = query.stream()
# [END firestore_query_order_with_filter]
print(results)
return results
def order_where_invalid():
db = firestore.Client(
add_unique_string=False
) # Flag for testing purposes, needs index to be precreated
# [START firestore_query_order_field_invalid]
cities_ref = db.collection("cities")
query = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
"country"
)
results = query.stream()
# [END firestore_query_order_field_invalid]
print(results)
return results
def cursor_simple_start_at():
db = firestore.Client()
# [START firestore_query_cursor_start_at_field_value_single]
cities_ref = db.collection("cities")
query_start_at = cities_ref.order_by("population").start_at({"population": 1000000})
# [END firestore_query_cursor_start_at_field_value_single]
return query_start_at
def cursor_simple_end_at():
db = firestore.Client()
# [START firestore_query_cursor_end_at_field_value_single]
cities_ref = db.collection("cities")
query_end_at = cities_ref.order_by("population").end_at({"population": 1000000})
# [END firestore_query_cursor_end_at_field_value_single]
return query_end_at
def snapshot_cursors():
db = firestore.Client()
# [START firestore_query_cursor_start_at_document]
doc_ref = db.collection("cities").document("SF")
snapshot = doc_ref.get()
start_at_snapshot = (
db.collection("cities").order_by("population").start_at(snapshot)
)
# [END firestore_query_cursor_start_at_document]
results = start_at_snapshot.limit(10).stream()
return results
def cursor_paginate():
db = firestore.Client()
# [START firestore_query_cursor_pagination]
cities_ref = db.collection("cities")
first_query = cities_ref.order_by("population").limit(3)
# Get the last document from the results
docs = first_query.stream()
last_doc = list(docs)[-1]
# Construct a new query starting at this document
# Note: this will not have the desired effect if
# multiple cities have the exact same population value
last_pop = last_doc.to_dict()["population"]
next_query = (
cities_ref.order_by("population").start_after({"population": last_pop}).limit(3)
)
# Use the query for pagination
# ...
# [END firestore_query_cursor_pagination]
return next_query
def listen_document():
db = firestore.Client()
# [START firestore_listen_document]
# Create an Event for notifying main thread.
callback_done = threading.Event()
# Create a callback on_snapshot function to capture changes
def on_snapshot(doc_snapshot, changes, read_time):
for doc in doc_snapshot:
print(f"Received document snapshot: {doc.id}")
callback_done.set()
doc_ref = db.collection("cities").document("SF")
# Watch the document
doc_watch = doc_ref.on_snapshot(on_snapshot)
# [END firestore_listen_document]
# Creating document
data = {
"name": "San Francisco",
"state": "CA",
"country": "USA",
"capital": False,
"population": 860000,
}
doc_ref.set(data)
# Wait for the callback.
callback_done.wait(timeout=60)
# [START firestore_listen_detach]
# Terminate watch on a document
doc_watch.unsubscribe()
# [END firestore_listen_detach]
def listen_multiple():
db = firestore.Client()
# [START firestore_listen_query_snapshots]
# Create an Event for notifying main thread.
callback_done = threading.Event()
# Create a callback on_snapshot function to capture changes
def on_snapshot(col_snapshot, changes, read_time):
print("Callback received query snapshot.")
print("Current cities in California:")
for doc in col_snapshot:
print(f"{doc.id}")
callback_done.set()
col_query = db.collection("cities").where(filter=FieldFilter("state", "==", "CA"))
# Watch the collection query
query_watch = col_query.on_snapshot(on_snapshot)
# [END firestore_listen_query_snapshots]
# Creating document
data = {
"name": "San Francisco",
"state": "CA",
"country": "USA",
"capital": False,
"population": 860000,
}
db.collection("cities").document("SF").set(data)
# Wait for the callback.
callback_done.wait(timeout=60)
query_watch.unsubscribe()
def listen_for_changes():
db = firestore.Client()
# [START firestore_listen_query_changes]
# Create an Event for notifying main thread.
delete_done = threading.Event()
# Create a callback on_snapshot function to capture changes
def on_snapshot(col_snapshot, changes, read_time):
print("Callback received query snapshot.")
print("Current cities in California: ")
for change in changes:
if change.type.name == "ADDED":
print(f"New city: {change.document.id}")
elif change.type.name == "MODIFIED":
print(f"Modified city: {change.document.id}")
elif change.type.name == "REMOVED":
print(f"Removed city: {change.document.id}")
delete_done.set()
col_query = db.collection("cities").where(filter=FieldFilter("state", "==", "CA"))
# Watch the collection query
query_watch = col_query.on_snapshot(on_snapshot)
# [END firestore_listen_query_changes]
mtv_document = db.collection("cities").document("MTV")
# Creating document
mtv_document.set(
{
"name": "Mountain View",
"state": "CA",
"country": "USA",
"capital": False,
"population": 80000,
}
)
sleep(1)
# Modifying document
mtv_document.update(
{
"name": "Mountain View",
"state": "CA",
"country": "USA",
"capital": False,
"population": 90000,
}
)
sleep(1)
# Delete document
mtv_document.delete()
# Wait for the callback captures the deletion.
delete_done.wait(timeout=60)
query_watch.unsubscribe()
def cursor_multiple_conditions():
db = firestore.Client(
add_unique_string=False
) # Flag for testing purposes, needs index to be precreated
# [START firestore_query_cursor_start_at_field_value_multi]
start_at_name = (
db.collection("cities").order_by("name").start_at({"name": "Springfield"})
)
start_at_name_and_state = (
db.collection("cities")
.order_by("name")
.order_by("state")
.start_at({"name": "Springfield", "state": "Missouri"})
)
# [END firestore_query_cursor_start_at_field_value_multi]
return start_at_name, start_at_name_and_state
def delete_single_doc():
db = firestore.Client()
# [START firestore_data_delete_doc]
db.collection("cities").document("DC").delete()
# [END firestore_data_delete_doc]
def delete_field():
db = firestore.Client()
# [START firestore_data_delete_field]
city_ref = db.collection("cities").document("BJ")
city_ref.update({"capital": firestore.DELETE_FIELD})
# [END firestore_data_delete_field]
def delete_full_collection():
db = firestore.Client()
# [START firestore_data_delete_collection]
def delete_collection(coll_ref, batch_size):
if batch_size == 0:
return
docs = coll_ref.list_documents(page_size=batch_size)
deleted = 0
for doc in docs:
print(f"Deleting doc {doc.id} => {doc.get().to_dict()}")
doc.delete()
deleted = deleted + 1
if deleted >= batch_size:
return delete_collection(coll_ref, batch_size)
# [END firestore_data_delete_collection]
delete_collection(db.collection("cities"), 10)
delete_collection(db.collection("data"), 10)
delete_collection(db.collection("objects"), 10)
delete_collection(db.collection("users"), 10)
delete_collection(db.collection("users"), 0)
def collection_group_query(db):
# [START firestore_query_collection_group_dataset]
cities = db.collection("cities")
sf_landmarks = cities.document("SF").collection("landmarks")
sf_landmarks.document().set({"name": "Golden Gate Bridge", "type": "bridge"})
sf_landmarks.document().set({"name": "Legion of Honor", "type": "museum"})
la_landmarks = cities.document("LA").collection("landmarks")
la_landmarks.document().set({"name": "Griffith Park", "type": "park"})
la_landmarks.document().set({"name": "The Getty", "type": "museum"})
dc_landmarks = cities.document("DC").collection("landmarks")
dc_landmarks.document().set({"name": "Lincoln Memorial", "type": "memorial"})
dc_landmarks.document().set(
{"name": "National Air and Space Museum", "type": "museum"}
)
tok_landmarks = cities.document("TOK").collection("landmarks")
tok_landmarks.document().set({"name": "Ueno Park", "type": "park"})
tok_landmarks.document().set(
{"name": "National Museum of Nature and Science", "type": "museum"}
)
bj_landmarks = cities.document("BJ").collection("landmarks")
bj_landmarks.document().set({"name": "Jingshan Park", "type": "park"})
bj_landmarks.document().set(
{"name": "Beijing Ancient Observatory", "type": "museum"}
)
# [END firestore_query_collection_group_dataset]
# [START firestore_query_collection_group_filter_eq]
museums = db.collection_group("landmarks").where(
filter=FieldFilter("type", "==", "museum")
)
docs = museums.stream()
for doc in docs:
print(f"{doc.id} => {doc.to_dict()}")
# [END firestore_query_collection_group_filter_eq]
return docs
def array_contains_any_queries(db):
# [START firestore_query_filter_array_contains_any]
cities_ref = db.collection("cities")
query = cities_ref.where(
filter=FieldFilter(
"regions", "array_contains_any", ["west_coast", "east_coast"]
)
)
return query
# [END firestore_query_filter_array_contains_any]
def in_query_without_array(db):
# [START firestore_query_filter_in]
cities_ref = db.collection("cities")
query = cities_ref.where(filter=FieldFilter("country", "in", ["USA", "Japan"]))
return query
# [END firestore_query_filter_in]
def in_query_with_array(db):
# [START firestore_query_filter_in_with_array]
cities_ref = db.collection("cities")
query = cities_ref.where(
filter=FieldFilter("regions", "in", [["west_coast"], ["east_coast"]])
)
return query
# [END firestore_query_filter_in_with_array]
def not_in_query(db):
# [START firestore_query_filter_not_in]
cities_ref = db.collection("cities")
query = cities_ref.where(filter=FieldFilter("country", "not-in", ["USA", "Japan"]))
return query
# [END firestore_query_filter_not_in]
def not_equal_query(db):
# [START firestore_query_filter_not_equal]
cities_ref = db.collection("cities")
query = cities_ref.where(filter=FieldFilter("capital", "!=", False))
return query
# [END firestore_query_filter_not_equal]
def update_document_increment(db):
# [START firestore_data_set_numeric_increment]
washington_ref = db.collection("cities").document("DC")
washington_ref.update({"population": firestore.Increment(50)})
# [END firestore_data_set_numeric_increment]
def list_document_subcollections():
db = firestore.Client()
# [START firestore_data_get_sub_collections]
city_ref = db.collection("cities").document("SF")
collections = city_ref.collections()
for collection in collections:
for doc in collection.stream():
print(f"{doc.id} => {doc.to_dict()}")
# [END firestore_data_get_sub_collections]
def _setup_bundle():
from google.cloud import firestore
db = firestore.Client()
db.collection("stories").document("news-item").set({"title": "Wow!"})
def create_and_build_bundle():
_setup_bundle()
# [START firestore_create_and_build_bundle]
from google.cloud import firestore
from google.cloud.firestore_bundle import FirestoreBundle
db = firestore.Client()
bundle = FirestoreBundle("latest-stories")
doc_snapshot = db.collection("stories").document("news-item").get()
query = db.collection("stories")._query()
# Build the bundle
# Note how `query` is named "latest-stories-query"
bundle_buffer: str = (
bundle.add_document(doc_snapshot)
.add_named_query(
"latest-stories-query",
query,
)
.build()
)
# [END firestore_create_and_build_bundle]
return bundle, bundle_buffer
def regional_endpoint():
# [START firestore_regional_endpoint]
ENDPOINT = "nam5-firestore.googleapis.com"
client_options = ClientOptions(api_endpoint=ENDPOINT)
db = firestore.Client(client_options=client_options)
cities_query = db.collection("cities").limit(2).get()
for r in cities_query:
print(r)
# [END firestore_regional_endpoint]
return cities_query
def query_filter_compound_multi_ineq():
from google.cloud import firestore
db = firestore.Client(
add_unique_string=False
) # Flag for testing purposes, needs index to be precreated
# [START firestore_query_filter_compound_multi_ineq]
query = (
db.collection("cities")
.where(filter=FieldFilter("population", ">", 1_000_000))
.where(filter=FieldFilter("density", "<", 10_000))
)
# [END firestore_query_filter_compound_multi_ineq]
return query
def query_indexing_considerations():
db = firestore.Client(
add_unique_string=False
) # Flag for testing purposes, needs index to be precreated
# [START firestore_query_indexing_considerations]
query = (
db.collection("employees")
.where(filter=FieldFilter("salary", ">", 100_000))
.where(filter=FieldFilter("experience", ">", 0))
.order_by("salary")
.order_by("experience")
)
# [END firestore_query_indexing_considerations]
return query
def query_order_fields():
db = firestore.Client()
# [START firestore_query_order_fields]
query = (
db.collection("employees")
.where(filter=FieldFilter("salary", ">", 100_000))
.order_by("salary")
)
results = query.stream()
# Order results by `experience`
sorted_results = sorted(results, key=lambda x: x.get("experience"))
# [END firestore_query_order_fields]
return sorted_results