From 01848bde7dbf1d9ed7bc8868dd7d7deacddb1c47 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Wed, 29 Oct 2025 15:21:03 -0700 Subject: [PATCH 01/19] Add pipelines snippets --- firestore-next/package.json | 1 + firestore-next/test.firestore.js | 1293 +++++++++++++++++++++++++++++- 2 files changed, 1291 insertions(+), 3 deletions(-) diff --git a/firestore-next/package.json b/firestore-next/package.json index faff0996..de740d5c 100644 --- a/firestore-next/package.json +++ b/firestore-next/package.json @@ -6,6 +6,7 @@ }, "license": "Apache-2.0", "dependencies": { + "@firebase/firestore": "https://firebasestorage.googleapis.com/v0/b/firestore-sdk-nightly.appspot.com/o/pipeline-sdk-builds%2Fweb%2Ffirebase-firestore-v4.9.2-piplines.prerelease.3.tgz?alt=media", "firebase": "^12.4.0", "geofire-common": "^6.0.0" }, diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 214077fd..4819e00b 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -35,9 +35,8 @@ const cityConverter = { describe("firestore", () => { const { Firestore } = require("firebase/firestore"); - /** @type {Firestore} */ - let db; - let app; +let app; +let db; before(() => { const { initializeApp } = require("firebase/app"); @@ -1309,3 +1308,1291 @@ describe("firestore", () => { }); }); }); + +describe("firestore-pipelines", () => { + const { getFirestore, doc } = require("@firebase/firestore") + const { + Pipeline, + field, + constant, + countAll, + AggregateFunction, + and, + or, + xor, + conditional + } = require("@firebase/firestore/pipelines"); + + let db; + let app; + + before(() => { + const { initializeApp } = require("firebase/app"); + const config = { + apiKey: "AIzaSyCM61mMr_iZnP1DzjT1PMB5vDGxfyWNM64", + authDomain: "firestore-snippets.firebaseapp.com", + projectId: "firestore-snippets" + }; + app = initializeApp(config); + db = getFirestore(app, "enterprise"); + }); + + function pipelineConcepts() { + // [START pipeline_concepts] + const pipeline = db.pipeline() + // Step 1: Start a query with collection scope + .collection("cities") + // Step 2: Filter the collection + .where(field("population").greaterThan(100000)) + // Step 3: Sort the remaining documents + .sort([field("name").ascending()]) + // Step 4: Return the top 10. Note applying the limit earlier in the pipeline would have + // unintentional results. + .limit(10); + // [END pipeline_concepts] + console.log(pipeline); + } + + function pipelineInitialization() { + // [START pipeline_initialization] + const { getFirestore } = require("@firebase/firestore"); + const database = getFirestore(app, "enterprise"); + const pipeline = database.pipeline(); + // [END pipeline_initialization] + console.log(pipeline); + } + + function fieldVsConstants() { + // [START field_or_constant] + const pipeline = db.pipeline() + .collection("cities") + .where(field("name").equal(constant("Toronto"))); + // [END field_or_constant] + console.log(pipeline); + } + + async function inputStages() { + // [START input_stages] + let results; + + // Return all restaurants in San Francisco + results = await db.pipeline().collection("cities/sf/restaurants").execute(); + + // Return all restaurants + results = await db.pipeline().collectionGroup("restaurants").execute(); + + // Return all documents across all collections in the database (the entire database) + results = await db.pipeline().database().execute(); + + // Batch read of 3 documents + results = await db.pipeline().documents([ + doc(db, "cities", "SF"), + doc(db, "cities", "DC"), + doc(db, "cities", "NY") + ]).execute(); + // [END input_stages] + console.log(results); + } + + async function wherePipeline() { + // [START pipeline_where] + let results; + + results = await db.pipeline().collection("books") + .where(field("rating").equal(5)) + .where(field("published").lessThan(1900)) + .execute(); + + results = await db.pipeline().collection("books") + .where(and(field("rating").equal(5), (field("published").lessThan(1900)))) + .execute(); + // [END pipeline_where] + console.log(results); + } + + async function aggregateGroups() { + // [START aggregate_groups] + const results = await db.pipeline() + .collection("books") + .aggregate([ + field("rating").average().as("avg_rating") + ], { + groups: [ + field("genre") + ] + }) + .execute(); + // [END aggregate_groups] + console.log(results); + } + + async function aggregateDistinct() { + // [START aggregate_distinct] + const results = await db.pipeline() + .collection("books") + .distinct([ + field("author").toUpper().as("author"), + field("genre") + ]) + .execute(); + // [END aggregate_distinct] + console.log(results); + } + + async function sort() { + // [START sort] + const results = await db.pipeline() + .collection("books") + .sort([ + field("release_date").descending(), field("author").ascending() + ]) + .execute(); + // [END sort] + console.log(results); + } + + function sortComparison() { + // [START sort_comparison] + const query = db.collection("cities") + .orderBy("state") + .orderBy("population", "desc"); + + const pipeline = db.pipeline() + .collection("books") + .sort([ + field("release_date").descending(), field("author").ascending() + ]); + // [END sort_comparison] + console.log(query); + console.log(pipeline); + } + + async function functions() { + // [START functions_example] + let results; + + // Type 1: Scalar (for use in non-aggregation stages) + // Example: Return the min store price for each book. + results = await db.pipeline().collection("books") + .select([ + field("current").logicalMinimum(["updated"]).as("price_min") + ]) + .execute(); + + // Type 2: Aggregation (for use in aggregate stages) + // Example: Return the min price of all books. + results = await db.pipeline().collection("books") + .aggregate([field("price").minimum().as("min_price")]) + .execute(); + // [END functions_example] + console.log(results); + } + + async function creatingIndexes() { + // [START query_example] + const results = await db.pipeline() + .collection("books") + .where(field("published").lessThan(1900)) + .where(field("genre").equal("Science Fiction")) + .where(field("rating").greaterThan(4.3)) + .sort([field("published").descending()]) + .execute(); + // [END query_example] + console.log(results); + } + + async function sparseIndexes() { + // [START sparse_index_example] + const results = await db.pipeline() + .collection("books") + .where(field("category").like("%fantasy%")) + .execute(); + // [END sparse_index_example] + console.log(results); + } + + async function sparseIndexes2() { + // [START sparse_index_example_2] + const results = await db.pipeline() + .collection("books") + .sort([field("release_date").ascending()]) + .execute(); + // [END sparse_index_example_2] + console.log(results); + } + + async function coveredQuery() { + // [START covered_query] + const results = await db.pipeline() + .collection("books") + .where(field("category").like("%fantasy%")) + .where(field("title").exists()) + .where(field("author").exists()) + .select([field("title"), field("author")]) + .execute(); + // [END covered_query] + console.log(results); + } + + function pagination() { + // [START pagination_not_supported_preview] + // Existing pagination via `startAt()` + const query = db.collection("cities").orderBy("population").startAt(1000000); + + // Private preview workaround using pipelines + const pipeline = db.pipeline() + .collection("cities") + .where(field("population").greaterThanOrEqual(1000000)) + .sort([field("population").descending()]); + // [END pagination_not_supported_preview] + console.log(query); + console.log(pipeline); + } + + async function collectionStage() { + // [START collection_example] + const results = await db.pipeline() + .collection("users/bob/games") + .sort([field("name").ascending()]) + .execute(); + // [END collection_example] + console.log(results); + } + + async function collectionGroupStage() { + // [START collection_group_example] + const results = await db.pipeline() + .collectionGroup("games") + .sort([field("name").ascending()]) + .execute(); + // [END collection_group_example] + console.log(results); + } + + async function databaseStage() { + // [START database_example] + // Count all documents in the database + const results = await db.pipeline() + .database() + .aggregate([countAll().as("total")]) + .execute(); + // [END database_example] + console.log(results); + } + + async function documentsStage() { + // [START documents_example] + const results = await db.pipeline() + .documents([ + doc(db, "cities", "SF"), + doc(db, "cities", "DC"), + doc(db, "cities", "NY") + ]).execute(); + // [END documents_example] + console.log(results); + } + + async function replaceWithStage() { + // [START initial_data] + await db.collection("cities").doc("SF").set({ + "name": "San Francisco", + "population": 800000, + "location": { + "country": "USA", + "state": "California" + } + }); + await db.collection("cities").doc("TO").set({ + "name": "Toronto", + "population": 3000000, + "province": "ON", + "location": { + "country": "Canada", + "province": "Ontario" + } + }); + await db.collection("cities").doc("NY").set({ + "name": "New York", + "location": { + "country": "USA", + "state": "New York" + } + }); + await db.collection("cities").doc("AT").set({ + "name": "Atlantis", + }); + // [END initial_data] + + // [START full_replace] + const names = await db.pipeline() + .collection("cities") + .replace(field("location")) + .execute(); + // [END full_replace] + + // [START map_merge_overwrite] + // unsupported in client SDKs for now + // [END map_merge_overwrite] + console.log(names); + } + + async function sampleStage() { + // [START sample_example] + let results; + + // Get a sample of 100 documents in a database + results = await db.pipeline() + .database() + .sample(100) + .execute(); + + // Randomly shuffle a list of 3 documents + results = await db.pipeline() + .documents([ + doc(db, "cities", "SF"), + doc(db, "cities", "NY"), + doc(db, "cities", "DC"), + ]) + .sample(3) + .execute(); + // [END sample_example] + console.log(results); + } + + async function samplePercent() { + // [START sample_percent] + // Get a sample of on average 50% of the documents in the database + const results = await db.pipeline() + .database() + .sample({ percentage: 0.5 }) + .execute(); + // [END sample_percent] + console.log(results); + } + + async function unionStage() { + // [START union_stage] + const results = await db.pipeline() + .collection("cities/SF/restaurants") + .where(field("type").equal("Chinese")) + .union(db.pipeline() + .collection("cities/NY/restaurants") + .where(field("type").equal("Italian"))) + .where(field("rating").greaterThanOrEqual(4.5)) + .sort([field("__name__").descending()]) + .execute(); + // [END union_stage] + console.log(results); + } + + async function unionStageStable() { + // [START union_stage_stable] + const results = await db.pipeline() + .collection("cities/SF/restaurants") + .where(field("type").equal("Chinese")) + .union(db.pipeline() + .collection("cities/NY/restaurants") + .where(field("type").equal("Italian")), { stable: true }) + .where(field("rating").greaterThanOrEqual(4.5)) + .sort([field("__name__").descending()]) + .execute(); + // [END union_stage_stable] + console.log(results); + } + + async function unnestStage() { + // [START unnest_stage] + const results = await db.pipeline() + .database() + .unnest(field("arrayField").as("unnestedArrayField"), { indexField: "index" }) + .execute(); + // [END unnest_stage] + console.log(results); + } + + async function unnestStageEmptyOrNonArray() { + // [START unnest_edge_cases] + // Input + // { identifier : 1, neighbors: [ "Alice", "Cathy" ] } + // { identifier : 2, neighbors: [] } + // { identifier : 3, neighbors: "Bob" } + + const results = await db.pipeline() + .database() + .unnest(field("neighbors").as("unnestedNeighbors"), { indexField: "index" }) + .execute(); + + // Output + // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Alice", index: 0 } + // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Cathy", index: 1 } + // { identifier: 3, neighbors: "Bob", index: null} + // [END unneest_edge_cases] + console.log(results); + } + + async function countFunction() { + // [START count_function] + // Total number of books in the collection + const countOfAll = await db.pipeline() + .collection("books") + .aggregate([countAll().as("count")]) + .execute(); + + // Number of books with nonnull `ratings` field + const countField = await db.pipeline() + .collection("books") + .aggregate([field("ratings").count().as("count")]) + .execute(); + // [END count_function] + console.log(countOfAll); + console.log(countField); + } + + async function countIfFunction() { + // [START count_if] + const result = await db.pipeline() + .collection("books") + .aggregate( + field("rating").greaterThan(4).countIf().as("filteredCount") + ) + .execute(); + // [END count_if] + console.log(result); + } + + async function countDistinctFunction() { + // [START count_distinct] + const result = await db.pipeline() + .collection("books") + .aggregate(field("author").countDistinct().as("unique_authors")) + .execute(); + // [END count_distinct] + console.log(result); + } + + async function sumFunction() { + // [START sum_function] + const result = await db.pipeline() + .collection("cities") + .aggregate([field("population").sum().as("totalPopulation")]) + .execute(); + // [END sum_function] + console.log(result); + } + + async function avgFunction() { + // [START avg_function] + const result = await db.pipeline() + .collection("cities") + .aggregate([field("population").average().as("averagePopulation")]) + .execute(); + // [END avg_function] + console.log(result); + } + + async function minFunction() { + // [START min_function] + const result = await db.pipeline() + .collection("books") + .aggregate([field("price").minimum().as("minimumPrice")]) + .execute(); + // [END min_function] + console.log(result); + } + + async function maxFunction() { + // [START max_function] + const result = await db.pipeline() + .collection("books") + .aggregate([field("price").maximum().as("maximumPrice")]) + .execute(); + // [END max_function] + console.log(result); + } + + async function addFunction() { + // [START add_function] + const result = await db.pipeline() + .collection("books") + .select([field("soldBooks").add(field("unsoldBooks")).as("totalBooks")]) + .execute(); + // [END add_function] + console.log(result); + } + + async function subtractFunction() { + // [START subtract_function] + const storeCredit = 7; + const result = await db.pipeline() + .collection("books") + .select([field("price").subtract(constant(storeCredit)).as("totalCost")]) + .execute(); + // [END subtract_function] + console.log(result); + } + + async function multiplyFunction() { + // [START multiply_function] + const result = await db.pipeline() + .collection("books") + .select([field("price").multiply(field("soldBooks")).as("revenue")]) + .execute(); + // [END multiply_function] + console.log(result); + } + + async function divideFunction() { + // [START divide_function] + const result = await db.pipeline() + .collection("books") + .select([field("ratings").divide(field("soldBooks")).as("reviewRate")]) + .execute(); + // [END divide_function] + console.log(result); + } + + async function modFunction() { + // [START mod_function] + const displayCapacity = 1000; + const result = await db.pipeline() + .collection("books") + .select([field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")]) + .execute(); + // [END mod_function] + console.log(result); + } + + async function ceilFunction() { + // [START ceil_function] + const booksPerShelf = 100; + const result = await db.pipeline() + .collection("books") + .select([ + field("unsoldBooks").divide(constant(booksPerShelf)).ceil().as("requiredShelves") + ]) + .execute(); + // [END ceil_function] + console.log(result); + } + + async function floorFunction() { + // [START floor_function] + const result = await db.pipeline() + .collection("books") + .addFields([ + field("wordCount").divide(field("pages")).floor().as("wordsPerPage") + ]) + .execute(); + // [END floor_function] + console.log(result); + } + + async function roundFunction() { + // [START round_function] + const result = await db.pipeline() + .collection("books") + .select([field("soldBooks").multiply(field("price")).round().as("partialRevenue")]) + .aggregate([field("partialRevenue").sum().as("totalRevenue")]) + .execute(); + // [END round_function] + console.log(result); + } + + async function powFunction() { + // [START pow_function] + const googleplex = { latitude: 37.4221, longitude: 122.0853 }; + const result = await db.pipeline() + .collection("cities") + .addFields([ + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ]) + .select([ + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ]) + .execute(); + // [END pow_function] + console.log(result); + } + + async function sqrtFunction() { + // [START sqrt_function] + const googleplex = { latitude: 37.4221, longitude: 122.0853 }; + const result = await db.pipeline() + .collection("cities") + .addFields([ + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ]) + .select([ + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ]) + .execute(); + // [END sqrt_function] + console.log(result); + } + + async function expFunction() { + // [START exp_function] + const result = await db.pipeline() + .collection("books") + .select([field("rating").exp().as("expRating")]) + .execute(); + // [END exp_function] + console.log(result); + } + + async function lnFunction() { + // [START ln_function] + const result = await db.pipeline() + .collection("books") + .select([field("rating").ln().as("lnRating")]) + .execute(); + // [END ln_function] + console.log(result); + } + + async function logFunction() { + // [START log_function] + // Not supported on JS + // [END log_function] + } + + async function arrayConcat() { + // [START array_concat] + const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayConcat([field("subGenre")]).as("allGenres")]) + .execute(); + // [END array_concat] + console.log(result); + } + + async function arrayContains() { + // [START array_contains] + const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayContains(constant("mystery")).as("isMystery")]) + .execute(); + // [END array_contains] + console.log(result); + } + + async function arrayContainsAll() { + // [START array_contains_all] + const result = await db.pipeline() + .collection("books") + .select([ + field("genre") + .arrayContainsAll([constant("fantasy"), constant("adventure")]) + .as("isFantasyAdventure") + ]) + .execute(); + // [END array_contains_all] + console.log(result); + } + + async function arrayContainsAny() { + // [START array_contains_any] + const result = await db.pipeline() + .collection("books") + .select([ + field("genre") + .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) + .as("isMysteryOrFantasy") + ]) + .execute(); + // [END array_contains_any] + console.log(result); + } + + async function arrayLength() { + // [START array_length] + const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayLength().as("genreCount")]) + .execute(); + // [END array_length] + console.log(result); + } + + async function arrayReverse() { + // [START array_reverse] + const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayReverse().as("reversedGenres")]) + .execute(); + // [END array_reverse] + console.log(result); + } + + async function equalFunction() { + // [START equal_function] + const result = await db.pipeline() + .collection("books") + .select([field("rating").equal(5).as("hasPerfectRating")]) + .execute(); + // [END equal_function] + console.log(result); + } + + async function greaterThanFunction() { + // [START greater_than] + const result = await db.pipeline() + .collection("books") + .select([field("rating").greaterThan(4).as("hasHighRating")]) + .execute(); + // [END greater_than] + console.log(result); + } + + async function greaterThanOrEqualToFunction() { + // [START greater_or_equal] + const result = await db.pipeline() + .collection("books") + .select([field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")]) + .execute(); + // [END greater_or_equal] + console.log(result); + } + + async function lessThanFunction() { + // [START less_than] + const result = await db.pipeline() + .collection("books") + .select([field("published").lessThan(1923).as("isPublicDomainProbably")]) + .execute(); + // [END less_than] + console.log(result); + } + + async function lessThanOrEqualToFunction() { + // START less_or_equal] + const result = await db.pipeline() + .collection("books") + .select([field("rating").lessThanOrEqual(2).as("hasBadRating")]) + .execute(); + // [END less_or_equal] + console.log(result); + } + + async function notEqualFunction() { + // [START not_equal] + const result = await db.pipeline() + .collection("books") + .select([field("title").notEqual("1984").as("not1984")]) + .execute(); + // [END not_equal] + console.log(result); + } + + async function existsFunction() { + // [START exists_function] + const result = await db.pipeline() + .collection("books") + .select([field("rating").exists().as("hasRating")]) + .execute(); + // [END exists_function] + console.log(result); + } + + async function andFunction() { + // [START and_function] + const result = await db.pipeline() + .collection("books") + .select([ + and(field("rating").greaterThan(4), (field("price").lessThan(10))) + .as("under10Recommendation") + ]) + .execute(); + // [END and_function] + console.log(result); + } + + async function orFunction() { + // [START or_function] + const result = await db.pipeline() + .collection("books") + .select([ + or(field("genre").equal("Fantasy"), (field("tags").arrayContains("adventure"))) + .as("matchesSearchFilters") + ]) + .execute(); + // [END or_function] + console.log(result); + } + + async function xorFunction() { + // [START xor_function] + const result = await db.pipeline() + .collection("books") + .select([ + xor(field("tags").arrayContains("magic"), (field("tags").arrayContains("nonfiction"))) + .as("matchesSearchFilters") + ]) + .execute(); + // [END xor_function] + console.log(result); + } + + async function notFunction() { + // [START not_function] + const result = await db.pipeline() + .collection("books") + .select([ + (field("tags").arrayContains("nonfiction").not()) + .as("isFiction") + ]) + .execute(); + // [END not_function] + console.log(result); + } + + async function condFunction() { + // [START cond_function] + const result = await db.pipeline() + .collection("books") + .select([ + field("tags").arrayConcat([ + field("pages").greaterThan(100) + .conditional(constant("longRead"), constant("shortRead")) + ]).as("extendedTags") + ]) + .execute(); + // [END cond_function] + console.log(result); + } + + async function equalAnyFunction() { + // [START eq_any] + const result = await db.pipeline() + .collection("books") + .select([ + field("genre").equalAny(["Science Fiction", "Psychological Thriller"]) + .as("matchesGenreFilters") + ]) + .execute(); + // [END eq_any] + console.log(result); + } + + async function notEqualAnyFunction() { + // [START not_eq_any] + const result = await db.pipeline() + .collection("books") + .select([ + field("author").notEqualAny(["George Orwell", "F. Scott Fitzgerald"]) + .as("byExcludedAuthors") + ]) + .execute(); + // [END not_eq_any] + console.log(result); + } + + async function isNaNFunction() { + // [START is_nan] + const result = await db.pipeline() + .collection("books") + .select([ + field("rating").isNan().as("hasInvalidRating") + ]) + .execute(); + // [END is_nan] + console.log(result); + } + + async function isNotNaNFunction() { + // [START is_not_nan] + const result = await db.pipeline() + .collection("books") + .select([ + field("rating").isNotNan().as("hasValidRating") + ]) + .execute(); + // [END is_not_nan] + console.log(result); + } + + async function maxLogicalFunction() { + // [START max_logical_function] + const result = await db.pipeline() + .collection("books") + .select([ + field("rating").logicalMaximum([1]).as("flooredRating") + ]) + .execute(); + // [END max_logical_function] + console.log(result); + } + + async function minLogicalFunction() { + // [START min_logical_function] + const result = await db.pipeline() + .collection("books") + .select([ + field("rating").logicalMinimum([5]).as("cappedRating") + ]) + .execute(); + // [END min_logical_function] + console.log(result); + } + + async function mapGetFunction() { + // [START map_get] + const result = await db.pipeline() + .collection("books") + .select([ + field("awards").mapGet("pulitzer").as("hasPulitzerAward") + ]) + .execute(); + // [END map_get] + console.log(result); + } + + async function byteLengthFunction() { + // [START byte_length] + const result = await db.pipeline() + .collection("books") + .select([ + field("title").byteLength().as("titleByteLength") + ]) + .execute(); + // [END byte_length] + console.log(result); + } + + async function charLengthFunction() { + // [START char_length] + const result = await db.pipeline() + .collection("books") + .select([ + field("title").charLength().as("titleCharLength") + ]) + .execute(); + // [END char_length] + console.log(result); + } + + async function startsWithFunction() { + // [START starts_with] + const result = await db.pipeline() + .collection("books") + .select([ + field("title").startsWith("The") + .as("needsSpecialAlphabeticalSort") + ]) + .execute(); + // [END starts_with] + console.log(result); + } + + async function endsWithFunction() { + const result = await db.pipeline() + .collection("inventory/devices/laptops") + .select([ + field("name").endsWith("16 inch") + .as("16InLaptops") + ]) + .execute(); + console.log(result); + } + + async function likeFunction() { + // [START like] + const result = await db.pipeline() + .collection("books") + .select([ + field("genre").like("%Fiction") + .as("anyFiction") + ]) + .execute(); + // [END like] + console.log(result); + } + + async function regexContainsFunction() { + // [START regex_contains] + const result = await db.pipeline() + .collection("documents") + .select([ + field("title").regexContains("Firestore (Enterprise|Standard)") + .as("isFirestoreRelated") + ]) + .execute(); + // [END regex_contains] + console.log(result); + } + + async function regexMatchFunction() { + // [START regex_match] + const result = await db.pipeline() + .collection("documents") + .select([ + field("title").regexMatch("Firestore (Enterprise|Standard)") + .as("isFirestoreExactly") + ]) + .execute(); + // [END regex_match] + console.log(result); + } + + async function strConcatFunction() { + // [START str_concat] + const result = await db.pipeline() + .collection("books") + .select([ + field("title").stringConcat(" by ", field("author")) + .as("fullyQualifiedTitle") + ]) + .execute(); + // [END str_concat] + console.log(result); + } + + async function strContainsFunction() { + // [START string_contains] + const result = await db.pipeline() + .collection("articles") + .select([ + field("body").stringContains("Firestore") + .as("isFirestoreRelated") + ]) + .execute(); + // [END string_contains] + console.log(result); + } + + async function toUpperFunction() { + // [START to_upper] + const result = await db.pipeline() + .collection("authors") + .select([ + field("name").toUpper() + .as("uppercaseName") + ]) + .execute(); + // [END to_upper] + console.log(result); + } + + async function toLowerFunction() { + // [START to_lower] + const result = await db.pipeline() + .collection("authors") + .select([ + field("genre").toLower().equal("fantasy") + .as("isFantasy") + ]) + .execute(); + // [END to_lower] + } + + async function substrFunction() { + // [START substr_function] + const result = await db.pipeline() + .collection("books") + .where(field("title").startsWith("The ")) + .select([ + field("title").substring(4) + .as("titleWithoutLeadingThe") + ]) + .execute(); + // [END substr_function] + console.log(result); + } + + async function strReverseFunction() { + // [START str_reverse] + const result = await db.pipeline() + .collection("books") + .select([ + field("name").reverse().as("reversedName") + ]) + .execute(); + // [END str_reverse] + console.log(result); + } + + async function strTrimFunction() { + // [START trim_function] + const result = await db.pipeline() + .collection("books") + .select([ + field("name").trim().as("whitespaceTrimmedName") + ]) + .execute(); + // [END trim_function] + console.log(result); + } + + async function strReplaceFunction() { + // not yet supported until GA + } + + async function strSplitFunction() { + // not yet supported until GA + } + + async function unixMicrosToTimestampFunction() { + // [START unix_micros_timestamp] + const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAtMicros").unixMicrosToTimestamp().as("createdAtString") + ]) + .execute(); + // [END unix_micros_timestamp] + console.log(result); + } + + async function unixMillisToTimestampFunction() { + // [START unix_millis_timestamp] + const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAtMillis").unixMillisToTimestamp().as("createdAtString") + ]) + .execute(); + // [END unix_millis_timestamp] + console.log(result); + } + + async function unixSecondsToTimestampFunction() { + // [START unix_seconds_timestamp] + const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAtSeconds").unixSecondsToTimestamp().as("createdAtString") + ]) + .execute(); + // [END unix_seconds_timestamp] + console.log(result); + } + + async function timestampAddFunction() { + // [START timestamp_add] + const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAt").timestampAdd("day", 3653).as("expiresAt") + ]) + .execute(); + // [END timestamp_add] + console.log(result); + } + + async function timestampSubFunction() { + // [START timestamp_sub] + const result = await db.pipeline() + .collection("documents") + .select([ + field("expiresAt").timestampSubtract("day", 14).as("sendWarningTimestamp") + ]) + .execute(); + // [END timestamp_sub] + console.log(result); + } + + async function timestampToUnixMicrosFunction() { + // [START timestamp_unix_micros] + const result = await db.pipeline() + .collection("documents") + .select([ + field("dateString").timestampToUnixMicros().as("unixMicros") + ]) + .execute(); + // [END timestamp_unix_micros] + console.log(result); + } + + async function timestampToUnixMillisFunction() { + // [START timestamp_unix_millis] + const result = await db.pipeline() + .collection("documents") + .select([ + field("dateString").timestampToUnixMillis().as("unixMillis") + ]) + .execute(); + // [END timestamp_unix_millis] + console.log(result); + } + + async function timestampToUnixSecondsFunction() { + // [START timestamp_unix_seconds] + const result = await db.pipeline() + .collection("documents") + .select([ + field("dateString").timestampToUnixSeconds().as("unixSeconds") + ]) + .execute(); + // [END timestamp_unix_seconds] + console.log(result); + } + + async function cosineDistanceFunction() { + // [START cosine_distance] + const sampleVector = [0.0, 1, 2, 3, 4, 5]; + const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").cosineDistance(sampleVector).as("cosineDistance") + ]) + .execute(); + // [END cosine_distance] + console.log(result); + } + + async function dotProductFunction() { + // [START dot_product] + const sampleVector = [0.0, 1, 2, 3, 4, 5]; + const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").dotProduct(sampleVector).as("dotProduct") + ]) + .execute(); + // [END dot_product] + console.log(result); + } + + async function euclideanDistanceFunction() { + // [START euclidean_distance] + const sampleVector = [0.0, 1, 2, 3, 4, 5]; + const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").euclideanDistance(sampleVector).as("euclideanDistance") + ]) + .execute(); + // [END euclidean_distance] + console.log(result); + } + + async function vectorLengthFunction() { + // [START vector_length] + const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").vectorLength().as("vectorLength") + ]) + .execute(); + // [END vector_length] + console.log(result); + } +}); \ No newline at end of file From 822bea85fe630014ed64f79507c41dbc1f64e9d8 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Wed, 29 Oct 2025 15:41:35 -0700 Subject: [PATCH 02/19] run snippets and fix some typos --- firestore-next/test.firestore.js | 13 +++---- .../test-firestore/add_function.js | 12 +++++++ .../test-firestore/aggregate_distinct.js | 15 ++++++++ .../test-firestore/aggregate_groups.js | 18 ++++++++++ .../test-firestore/and_function.js | 15 ++++++++ .../test-firestore/array_concat.js | 12 +++++++ .../test-firestore/array_contains.js | 12 +++++++ .../test-firestore/array_contains_all.js | 16 +++++++++ .../test-firestore/array_contains_any.js | 16 +++++++++ .../test-firestore/array_length.js | 12 +++++++ .../test-firestore/array_reverse.js | 12 +++++++ .../test-firestore/avg_function.js | 12 +++++++ .../test-firestore/byte_length.js | 14 ++++++++ .../test-firestore/ceil_function.js | 15 ++++++++ .../test-firestore/char_length.js | 14 ++++++++ .../test-firestore/collection_example.js | 12 +++++++ .../collection_group_example.js | 12 +++++++ .../test-firestore/cond_function.js | 17 +++++++++ .../test-firestore/cosine_distance.js | 15 ++++++++ .../test-firestore/count_distinct.js | 12 +++++++ .../test-firestore/count_function.js | 19 ++++++++++ .../firestore-next/test-firestore/count_if.js | 14 ++++++++ .../test-firestore/covered_query.js | 15 ++++++++ .../test-firestore/database_example.js | 13 +++++++ .../test-firestore/divide_function.js | 12 +++++++ .../test-firestore/documents_example.js | 14 ++++++++ .../test-firestore/dot_product.js | 15 ++++++++ .../firestore-next/test-firestore/eq_any.js | 15 ++++++++ .../test-firestore/equal_function.js | 12 +++++++ .../test-firestore/euclidean_distance.js | 15 ++++++++ .../test-firestore/exists_function.js | 12 +++++++ .../test-firestore/exp_function.js | 12 +++++++ .../test-firestore/field_or_constant.js | 11 ++++++ .../test-firestore/floor_function.js | 14 ++++++++ .../test-firestore/full_replace.js | 12 +++++++ .../test-firestore/functions_example.js | 23 ++++++++++++ .../test-firestore/greater_or_equal.js | 12 +++++++ .../test-firestore/greater_than.js | 12 +++++++ .../test-firestore/initial_data.js | 35 +++++++++++++++++++ .../test-firestore/input_stages.js | 25 +++++++++++++ .../firestore-next/test-firestore/is_nan.js | 14 ++++++++ .../test-firestore/is_not_nan.js | 14 ++++++++ .../test-firestore/less_or_equal.js | 12 +++++++ .../test-firestore/less_than.js | 12 +++++++ .../firestore-next/test-firestore/like.js | 15 ++++++++ .../test-firestore/ln_function.js | 12 +++++++ .../test-firestore/log_function.js | 9 +++++ .../firestore-next/test-firestore/map_get.js | 14 ++++++++ .../test-firestore/map_merge_overwrite.js | 9 +++++ .../test-firestore/max_function.js | 12 +++++++ .../test-firestore/max_logical_function.js | 14 ++++++++ .../test-firestore/min_function.js | 12 +++++++ .../test-firestore/min_logical_function.js | 14 ++++++++ .../test-firestore/mod_function.js | 13 +++++++ .../test-firestore/multiply_function.js | 12 +++++++ .../test-firestore/not_eq_any.js | 15 ++++++++ .../test-firestore/not_equal.js | 12 +++++++ .../test-firestore/not_function.js | 15 ++++++++ .../test-firestore/or_function.js | 15 ++++++++ .../pagination_not_supported_preview.js | 16 +++++++++ .../test-firestore/pipeline_concepts.js | 18 ++++++++++ .../test-firestore/pipeline_initialization.js | 11 ++++++ .../test-firestore/pipeline_where.js | 18 ++++++++++ .../test-firestore/pow_function.js | 27 ++++++++++++++ .../test-firestore/query_example.js | 15 ++++++++ .../test-firestore/regex_contains.js | 15 ++++++++ .../test-firestore/regex_match.js | 15 ++++++++ .../test-firestore/round_function.js | 13 +++++++ .../test-firestore/sample_example.js | 25 +++++++++++++ .../test-firestore/sample_percent.js | 13 +++++++ .../firestore-next/test-firestore/sort.js | 14 ++++++++ .../test-firestore/sort_comparison.js | 17 +++++++++ .../test-firestore/sparse_index_example.js | 12 +++++++ .../test-firestore/sqrt_function.js | 27 ++++++++++++++ .../test-firestore/starts_with.js | 15 ++++++++ .../test-firestore/str_concat.js | 15 ++++++++ .../test-firestore/str_reverse.js | 14 ++++++++ .../test-firestore/string_contains.js | 15 ++++++++ .../test-firestore/substr_function.js | 16 +++++++++ .../test-firestore/subtract_function.js | 13 +++++++ .../test-firestore/sum_function.js | 12 +++++++ .../test-firestore/timestamp_add.js | 14 ++++++++ .../test-firestore/timestamp_sub.js | 14 ++++++++ .../test-firestore/timestamp_unix_micros.js | 14 ++++++++ .../test-firestore/timestamp_unix_millis.js | 14 ++++++++ .../test-firestore/timestamp_unix_seconds.js | 14 ++++++++ .../firestore-next/test-firestore/to_lower.js | 15 ++++++++ .../firestore-next/test-firestore/to_upper.js | 15 ++++++++ .../test-firestore/trim_function.js | 14 ++++++++ .../test-firestore/union_stage.js | 17 +++++++++ .../test-firestore/union_stage_stable.js | 17 +++++++++ .../test-firestore/unix_micros_timestamp.js | 14 ++++++++ .../test-firestore/unix_millis_timestamp.js | 14 ++++++++ .../test-firestore/unix_seconds_timestamp.js | 14 ++++++++ .../test-firestore/unnest_edge_cases.js | 21 +++++++++++ .../test-firestore/unnest_stage.js | 12 +++++++ .../test-firestore/vector_length.js | 14 ++++++++ .../test-firestore/xor_function.js | 15 ++++++++ 98 files changed, 1435 insertions(+), 6 deletions(-) create mode 100644 snippets/firestore-next/test-firestore/add_function.js create mode 100644 snippets/firestore-next/test-firestore/aggregate_distinct.js create mode 100644 snippets/firestore-next/test-firestore/aggregate_groups.js create mode 100644 snippets/firestore-next/test-firestore/and_function.js create mode 100644 snippets/firestore-next/test-firestore/array_concat.js create mode 100644 snippets/firestore-next/test-firestore/array_contains.js create mode 100644 snippets/firestore-next/test-firestore/array_contains_all.js create mode 100644 snippets/firestore-next/test-firestore/array_contains_any.js create mode 100644 snippets/firestore-next/test-firestore/array_length.js create mode 100644 snippets/firestore-next/test-firestore/array_reverse.js create mode 100644 snippets/firestore-next/test-firestore/avg_function.js create mode 100644 snippets/firestore-next/test-firestore/byte_length.js create mode 100644 snippets/firestore-next/test-firestore/ceil_function.js create mode 100644 snippets/firestore-next/test-firestore/char_length.js create mode 100644 snippets/firestore-next/test-firestore/collection_example.js create mode 100644 snippets/firestore-next/test-firestore/collection_group_example.js create mode 100644 snippets/firestore-next/test-firestore/cond_function.js create mode 100644 snippets/firestore-next/test-firestore/cosine_distance.js create mode 100644 snippets/firestore-next/test-firestore/count_distinct.js create mode 100644 snippets/firestore-next/test-firestore/count_function.js create mode 100644 snippets/firestore-next/test-firestore/count_if.js create mode 100644 snippets/firestore-next/test-firestore/covered_query.js create mode 100644 snippets/firestore-next/test-firestore/database_example.js create mode 100644 snippets/firestore-next/test-firestore/divide_function.js create mode 100644 snippets/firestore-next/test-firestore/documents_example.js create mode 100644 snippets/firestore-next/test-firestore/dot_product.js create mode 100644 snippets/firestore-next/test-firestore/eq_any.js create mode 100644 snippets/firestore-next/test-firestore/equal_function.js create mode 100644 snippets/firestore-next/test-firestore/euclidean_distance.js create mode 100644 snippets/firestore-next/test-firestore/exists_function.js create mode 100644 snippets/firestore-next/test-firestore/exp_function.js create mode 100644 snippets/firestore-next/test-firestore/field_or_constant.js create mode 100644 snippets/firestore-next/test-firestore/floor_function.js create mode 100644 snippets/firestore-next/test-firestore/full_replace.js create mode 100644 snippets/firestore-next/test-firestore/functions_example.js create mode 100644 snippets/firestore-next/test-firestore/greater_or_equal.js create mode 100644 snippets/firestore-next/test-firestore/greater_than.js create mode 100644 snippets/firestore-next/test-firestore/initial_data.js create mode 100644 snippets/firestore-next/test-firestore/input_stages.js create mode 100644 snippets/firestore-next/test-firestore/is_nan.js create mode 100644 snippets/firestore-next/test-firestore/is_not_nan.js create mode 100644 snippets/firestore-next/test-firestore/less_or_equal.js create mode 100644 snippets/firestore-next/test-firestore/less_than.js create mode 100644 snippets/firestore-next/test-firestore/like.js create mode 100644 snippets/firestore-next/test-firestore/ln_function.js create mode 100644 snippets/firestore-next/test-firestore/log_function.js create mode 100644 snippets/firestore-next/test-firestore/map_get.js create mode 100644 snippets/firestore-next/test-firestore/map_merge_overwrite.js create mode 100644 snippets/firestore-next/test-firestore/max_function.js create mode 100644 snippets/firestore-next/test-firestore/max_logical_function.js create mode 100644 snippets/firestore-next/test-firestore/min_function.js create mode 100644 snippets/firestore-next/test-firestore/min_logical_function.js create mode 100644 snippets/firestore-next/test-firestore/mod_function.js create mode 100644 snippets/firestore-next/test-firestore/multiply_function.js create mode 100644 snippets/firestore-next/test-firestore/not_eq_any.js create mode 100644 snippets/firestore-next/test-firestore/not_equal.js create mode 100644 snippets/firestore-next/test-firestore/not_function.js create mode 100644 snippets/firestore-next/test-firestore/or_function.js create mode 100644 snippets/firestore-next/test-firestore/pagination_not_supported_preview.js create mode 100644 snippets/firestore-next/test-firestore/pipeline_concepts.js create mode 100644 snippets/firestore-next/test-firestore/pipeline_initialization.js create mode 100644 snippets/firestore-next/test-firestore/pipeline_where.js create mode 100644 snippets/firestore-next/test-firestore/pow_function.js create mode 100644 snippets/firestore-next/test-firestore/query_example.js create mode 100644 snippets/firestore-next/test-firestore/regex_contains.js create mode 100644 snippets/firestore-next/test-firestore/regex_match.js create mode 100644 snippets/firestore-next/test-firestore/round_function.js create mode 100644 snippets/firestore-next/test-firestore/sample_example.js create mode 100644 snippets/firestore-next/test-firestore/sample_percent.js create mode 100644 snippets/firestore-next/test-firestore/sort.js create mode 100644 snippets/firestore-next/test-firestore/sort_comparison.js create mode 100644 snippets/firestore-next/test-firestore/sparse_index_example.js create mode 100644 snippets/firestore-next/test-firestore/sqrt_function.js create mode 100644 snippets/firestore-next/test-firestore/starts_with.js create mode 100644 snippets/firestore-next/test-firestore/str_concat.js create mode 100644 snippets/firestore-next/test-firestore/str_reverse.js create mode 100644 snippets/firestore-next/test-firestore/string_contains.js create mode 100644 snippets/firestore-next/test-firestore/substr_function.js create mode 100644 snippets/firestore-next/test-firestore/subtract_function.js create mode 100644 snippets/firestore-next/test-firestore/sum_function.js create mode 100644 snippets/firestore-next/test-firestore/timestamp_add.js create mode 100644 snippets/firestore-next/test-firestore/timestamp_sub.js create mode 100644 snippets/firestore-next/test-firestore/timestamp_unix_micros.js create mode 100644 snippets/firestore-next/test-firestore/timestamp_unix_millis.js create mode 100644 snippets/firestore-next/test-firestore/timestamp_unix_seconds.js create mode 100644 snippets/firestore-next/test-firestore/to_lower.js create mode 100644 snippets/firestore-next/test-firestore/to_upper.js create mode 100644 snippets/firestore-next/test-firestore/trim_function.js create mode 100644 snippets/firestore-next/test-firestore/union_stage.js create mode 100644 snippets/firestore-next/test-firestore/union_stage_stable.js create mode 100644 snippets/firestore-next/test-firestore/unix_micros_timestamp.js create mode 100644 snippets/firestore-next/test-firestore/unix_millis_timestamp.js create mode 100644 snippets/firestore-next/test-firestore/unix_seconds_timestamp.js create mode 100644 snippets/firestore-next/test-firestore/unnest_edge_cases.js create mode 100644 snippets/firestore-next/test-firestore/unnest_stage.js create mode 100644 snippets/firestore-next/test-firestore/vector_length.js create mode 100644 snippets/firestore-next/test-firestore/xor_function.js diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 4819e00b..01c77d96 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -35,8 +35,9 @@ const cityConverter = { describe("firestore", () => { const { Firestore } = require("firebase/firestore"); -let app; -let db; + /** @type {Firestore} */ + let db; + let app; before(() => { const { initializeApp } = require("firebase/app"); @@ -1346,8 +1347,8 @@ describe("firestore-pipelines", () => { .where(field("population").greaterThan(100000)) // Step 3: Sort the remaining documents .sort([field("name").ascending()]) - // Step 4: Return the top 10. Note applying the limit earlier in the pipeline would have - // unintentional results. + // Step 4: Return the top 10. Note applying the limit earlier in the + // pipeline would have unintentional results. .limit(10); // [END pipeline_concepts] console.log(pipeline); @@ -1726,7 +1727,7 @@ describe("firestore-pipelines", () => { // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Alice", index: 0 } // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Cathy", index: 1 } // { identifier: 3, neighbors: "Bob", index: null} - // [END unneest_edge_cases] + // [END unnest_edge_cases] console.log(results); } @@ -2083,7 +2084,7 @@ describe("firestore-pipelines", () => { } async function lessThanOrEqualToFunction() { - // START less_or_equal] + // [START less_or_equal] const result = await db.pipeline() .collection("books") .select([field("rating").lessThanOrEqual(2).as("hasBadRating")]) diff --git a/snippets/firestore-next/test-firestore/add_function.js b/snippets/firestore-next/test-firestore/add_function.js new file mode 100644 index 00000000..f93097db --- /dev/null +++ b/snippets/firestore-next/test-firestore/add_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START add_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("soldBooks").add(field("unsoldBooks")).as("totalBooks")]) + .execute(); +// [END add_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/aggregate_distinct.js b/snippets/firestore-next/test-firestore/aggregate_distinct.js new file mode 100644 index 00000000..1956413a --- /dev/null +++ b/snippets/firestore-next/test-firestore/aggregate_distinct.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START aggregate_distinct_modular] +const results = await db.pipeline() + .collection("books") + .distinct([ + field("author").toUpper().as("author"), + field("genre") + ]) + .execute(); +// [END aggregate_distinct_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/aggregate_groups.js b/snippets/firestore-next/test-firestore/aggregate_groups.js new file mode 100644 index 00000000..213ef522 --- /dev/null +++ b/snippets/firestore-next/test-firestore/aggregate_groups.js @@ -0,0 +1,18 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START aggregate_groups_modular] +const results = await db.pipeline() + .collection("books") + .aggregate([ + field("rating").average().as("avg_rating") + ], { + groups: [ + field("genre") + ] + }) + .execute(); +// [END aggregate_groups_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/and_function.js b/snippets/firestore-next/test-firestore/and_function.js new file mode 100644 index 00000000..1f413e22 --- /dev/null +++ b/snippets/firestore-next/test-firestore/and_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START and_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + and(field("rating").greaterThan(4), (field("price").lessThan(10))) + .as("under10Recommendation") + ]) + .execute(); +// [END and_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_concat.js b/snippets/firestore-next/test-firestore/array_concat.js new file mode 100644 index 00000000..1b9bd090 --- /dev/null +++ b/snippets/firestore-next/test-firestore/array_concat.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_concat_modular] +const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayConcat([field("subGenre")]).as("allGenres")]) + .execute(); +// [END array_concat_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_contains.js b/snippets/firestore-next/test-firestore/array_contains.js new file mode 100644 index 00000000..a4b7a231 --- /dev/null +++ b/snippets/firestore-next/test-firestore/array_contains.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_contains_modular] +const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayContains(constant("mystery")).as("isMystery")]) + .execute(); +// [END array_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_contains_all.js b/snippets/firestore-next/test-firestore/array_contains_all.js new file mode 100644 index 00000000..dda980cb --- /dev/null +++ b/snippets/firestore-next/test-firestore/array_contains_all.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_contains_all_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("genre") + .arrayContainsAll([constant("fantasy"), constant("adventure")]) + .as("isFantasyAdventure") + ]) + .execute(); +// [END array_contains_all_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_contains_any.js b/snippets/firestore-next/test-firestore/array_contains_any.js new file mode 100644 index 00000000..0abad050 --- /dev/null +++ b/snippets/firestore-next/test-firestore/array_contains_any.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_contains_any_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("genre") + .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) + .as("isMysteryOrFantasy") + ]) + .execute(); +// [END array_contains_any_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_length.js b/snippets/firestore-next/test-firestore/array_length.js new file mode 100644 index 00000000..3cbcf150 --- /dev/null +++ b/snippets/firestore-next/test-firestore/array_length.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_length_modular] +const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayLength().as("genreCount")]) + .execute(); +// [END array_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_reverse.js b/snippets/firestore-next/test-firestore/array_reverse.js new file mode 100644 index 00000000..1f808342 --- /dev/null +++ b/snippets/firestore-next/test-firestore/array_reverse.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_reverse_modular] +const result = await db.pipeline() + .collection("books") + .select([field("genre").arrayReverse().as("reversedGenres")]) + .execute(); +// [END array_reverse_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/avg_function.js b/snippets/firestore-next/test-firestore/avg_function.js new file mode 100644 index 00000000..0ec3cf71 --- /dev/null +++ b/snippets/firestore-next/test-firestore/avg_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START avg_function_modular] +const result = await db.pipeline() + .collection("cities") + .aggregate([field("population").average().as("averagePopulation")]) + .execute(); +// [END avg_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/byte_length.js b/snippets/firestore-next/test-firestore/byte_length.js new file mode 100644 index 00000000..ea6e63dc --- /dev/null +++ b/snippets/firestore-next/test-firestore/byte_length.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START byte_length_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("title").byteLength().as("titleByteLength") + ]) + .execute(); +// [END byte_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/ceil_function.js b/snippets/firestore-next/test-firestore/ceil_function.js new file mode 100644 index 00000000..234209c7 --- /dev/null +++ b/snippets/firestore-next/test-firestore/ceil_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START ceil_function_modular] +const booksPerShelf = 100; +const result = await db.pipeline() + .collection("books") + .select([ + field("unsoldBooks").divide(constant(booksPerShelf)).ceil().as("requiredShelves") + ]) + .execute(); +// [END ceil_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/char_length.js b/snippets/firestore-next/test-firestore/char_length.js new file mode 100644 index 00000000..3090dfed --- /dev/null +++ b/snippets/firestore-next/test-firestore/char_length.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START char_length_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("title").charLength().as("titleCharLength") + ]) + .execute(); +// [END char_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/collection_example.js b/snippets/firestore-next/test-firestore/collection_example.js new file mode 100644 index 00000000..7c841dc9 --- /dev/null +++ b/snippets/firestore-next/test-firestore/collection_example.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START collection_example_modular] +const results = await db.pipeline() + .collection("users/bob/games") + .sort([field("name").ascending()]) + .execute(); +// [END collection_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/collection_group_example.js b/snippets/firestore-next/test-firestore/collection_group_example.js new file mode 100644 index 00000000..835d76bb --- /dev/null +++ b/snippets/firestore-next/test-firestore/collection_group_example.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START collection_group_example_modular] +const results = await db.pipeline() + .collectionGroup("games") + .sort([field("name").ascending()]) + .execute(); +// [END collection_group_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/cond_function.js b/snippets/firestore-next/test-firestore/cond_function.js new file mode 100644 index 00000000..bf8b50b4 --- /dev/null +++ b/snippets/firestore-next/test-firestore/cond_function.js @@ -0,0 +1,17 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START cond_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("tags").arrayConcat([ + field("pages").greaterThan(100) + .conditional(constant("longRead"), constant("shortRead")) + ]).as("extendedTags") + ]) + .execute(); +// [END cond_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/cosine_distance.js b/snippets/firestore-next/test-firestore/cosine_distance.js new file mode 100644 index 00000000..da91ec15 --- /dev/null +++ b/snippets/firestore-next/test-firestore/cosine_distance.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START cosine_distance_modular] +const sampleVector = [0.0, 1, 2, 3, 4, 5]; +const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").cosineDistance(sampleVector).as("cosineDistance") + ]) + .execute(); +// [END cosine_distance_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/count_distinct.js b/snippets/firestore-next/test-firestore/count_distinct.js new file mode 100644 index 00000000..c814473e --- /dev/null +++ b/snippets/firestore-next/test-firestore/count_distinct.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START count_distinct_modular] +const result = await db.pipeline() + .collection("books") + .aggregate(field("author").countDistinct().as("unique_authors")) + .execute(); +// [END count_distinct_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/count_function.js b/snippets/firestore-next/test-firestore/count_function.js new file mode 100644 index 00000000..245835fa --- /dev/null +++ b/snippets/firestore-next/test-firestore/count_function.js @@ -0,0 +1,19 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START count_function_modular] +// Total number of books in the collection +const countOfAll = await db.pipeline() + .collection("books") + .aggregate([countAll().as("count")]) + .execute(); + +// Number of books with nonnull `ratings` field +const countField = await db.pipeline() + .collection("books") + .aggregate([field("ratings").count().as("count")]) + .execute(); +// [END count_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/count_if.js b/snippets/firestore-next/test-firestore/count_if.js new file mode 100644 index 00000000..a6636da6 --- /dev/null +++ b/snippets/firestore-next/test-firestore/count_if.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START count_if_modular] +const result = await db.pipeline() + .collection("books") + .aggregate( + field("rating").greaterThan(4).countIf().as("filteredCount") + ) + .execute(); +// [END count_if_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/covered_query.js b/snippets/firestore-next/test-firestore/covered_query.js new file mode 100644 index 00000000..85c739bd --- /dev/null +++ b/snippets/firestore-next/test-firestore/covered_query.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START covered_query_modular] +const results = await db.pipeline() + .collection("books") + .where(field("category").like("%fantasy%")) + .where(field("title").exists()) + .where(field("author").exists()) + .select([field("title"), field("author")]) + .execute(); +// [END covered_query_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/database_example.js b/snippets/firestore-next/test-firestore/database_example.js new file mode 100644 index 00000000..a48a61a7 --- /dev/null +++ b/snippets/firestore-next/test-firestore/database_example.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START database_example_modular] +// Count all documents in the database +const results = await db.pipeline() + .database() + .aggregate([countAll().as("total")]) + .execute(); +// [END database_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/divide_function.js b/snippets/firestore-next/test-firestore/divide_function.js new file mode 100644 index 00000000..6d090274 --- /dev/null +++ b/snippets/firestore-next/test-firestore/divide_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START divide_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("ratings").divide(field("soldBooks")).as("reviewRate")]) + .execute(); +// [END divide_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/documents_example.js b/snippets/firestore-next/test-firestore/documents_example.js new file mode 100644 index 00000000..6236d385 --- /dev/null +++ b/snippets/firestore-next/test-firestore/documents_example.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START documents_example_modular] +const results = await db.pipeline() + .documents([ + doc(db, "cities", "SF"), + doc(db, "cities", "DC"), + doc(db, "cities", "NY") + ]).execute(); +// [END documents_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/dot_product.js b/snippets/firestore-next/test-firestore/dot_product.js new file mode 100644 index 00000000..b5fce945 --- /dev/null +++ b/snippets/firestore-next/test-firestore/dot_product.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START dot_product_modular] +const sampleVector = [0.0, 1, 2, 3, 4, 5]; +const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").dotProduct(sampleVector).as("dotProduct") + ]) + .execute(); +// [END dot_product_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/eq_any.js b/snippets/firestore-next/test-firestore/eq_any.js new file mode 100644 index 00000000..e1e517f3 --- /dev/null +++ b/snippets/firestore-next/test-firestore/eq_any.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START eq_any_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("genre").equalAny(["Science Fiction", "Psychological Thriller"]) + .as("matchesGenreFilters") + ]) + .execute(); +// [END eq_any_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/equal_function.js b/snippets/firestore-next/test-firestore/equal_function.js new file mode 100644 index 00000000..746a3bab --- /dev/null +++ b/snippets/firestore-next/test-firestore/equal_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START equal_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("rating").equal(5).as("hasPerfectRating")]) + .execute(); +// [END equal_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/euclidean_distance.js b/snippets/firestore-next/test-firestore/euclidean_distance.js new file mode 100644 index 00000000..195ed37a --- /dev/null +++ b/snippets/firestore-next/test-firestore/euclidean_distance.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START euclidean_distance_modular] +const sampleVector = [0.0, 1, 2, 3, 4, 5]; +const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").euclideanDistance(sampleVector).as("euclideanDistance") + ]) + .execute(); +// [END euclidean_distance_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/exists_function.js b/snippets/firestore-next/test-firestore/exists_function.js new file mode 100644 index 00000000..f7c1cdaf --- /dev/null +++ b/snippets/firestore-next/test-firestore/exists_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START exists_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("rating").exists().as("hasRating")]) + .execute(); +// [END exists_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/exp_function.js b/snippets/firestore-next/test-firestore/exp_function.js new file mode 100644 index 00000000..a0443622 --- /dev/null +++ b/snippets/firestore-next/test-firestore/exp_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START exp_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("rating").exp().as("expRating")]) + .execute(); +// [END exp_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/field_or_constant.js b/snippets/firestore-next/test-firestore/field_or_constant.js new file mode 100644 index 00000000..e77c253a --- /dev/null +++ b/snippets/firestore-next/test-firestore/field_or_constant.js @@ -0,0 +1,11 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START field_or_constant_modular] +const pipeline = db.pipeline() + .collection("cities") + .where(field("name").equal(constant("Toronto"))); +// [END field_or_constant_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/floor_function.js b/snippets/firestore-next/test-firestore/floor_function.js new file mode 100644 index 00000000..a77b9001 --- /dev/null +++ b/snippets/firestore-next/test-firestore/floor_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START floor_function_modular] +const result = await db.pipeline() + .collection("books") + .addFields([ + field("wordCount").divide(field("pages")).floor().as("wordsPerPage") + ]) + .execute(); +// [END floor_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/full_replace.js b/snippets/firestore-next/test-firestore/full_replace.js new file mode 100644 index 00000000..2cd7a744 --- /dev/null +++ b/snippets/firestore-next/test-firestore/full_replace.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START full_replace_modular] +const names = await db.pipeline() + .collection("cities") + .replace(field("location")) + .execute(); +// [END full_replace_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/functions_example.js b/snippets/firestore-next/test-firestore/functions_example.js new file mode 100644 index 00000000..e3bf5310 --- /dev/null +++ b/snippets/firestore-next/test-firestore/functions_example.js @@ -0,0 +1,23 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START functions_example_modular] +let results; + +// Type 1: Scalar (for use in non-aggregation stages) +// Example: Return the min store price for each book. +results = await db.pipeline().collection("books") + .select([ + field("current").logicalMinimum(["updated"]).as("price_min") + ]) + .execute(); + +// Type 2: Aggregation (for use in aggregate stages) +// Example: Return the min price of all books. +results = await db.pipeline().collection("books") + .aggregate([field("price").minimum().as("min_price")]) + .execute(); +// [END functions_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/greater_or_equal.js b/snippets/firestore-next/test-firestore/greater_or_equal.js new file mode 100644 index 00000000..0d9cedb0 --- /dev/null +++ b/snippets/firestore-next/test-firestore/greater_or_equal.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START greater_or_equal_modular] +const result = await db.pipeline() + .collection("books") + .select([field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")]) + .execute(); +// [END greater_or_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/greater_than.js b/snippets/firestore-next/test-firestore/greater_than.js new file mode 100644 index 00000000..3b12ff25 --- /dev/null +++ b/snippets/firestore-next/test-firestore/greater_than.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START greater_than_modular] +const result = await db.pipeline() + .collection("books") + .select([field("rating").greaterThan(4).as("hasHighRating")]) + .execute(); +// [END greater_than_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/initial_data.js b/snippets/firestore-next/test-firestore/initial_data.js new file mode 100644 index 00000000..40dadc45 --- /dev/null +++ b/snippets/firestore-next/test-firestore/initial_data.js @@ -0,0 +1,35 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START initial_data_modular] +await db.collection("cities").doc("SF").set({ + "name": "San Francisco", + "population": 800000, + "location": { + "country": "USA", + "state": "California" + } +}); +await db.collection("cities").doc("TO").set({ + "name": "Toronto", + "population": 3000000, + "province": "ON", + "location": { + "country": "Canada", + "province": "Ontario" + } +}); +await db.collection("cities").doc("NY").set({ + "name": "New York", + "location": { + "country": "USA", + "state": "New York" + } +}); +await db.collection("cities").doc("AT").set({ + "name": "Atlantis", +}); +// [END initial_data_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/input_stages.js b/snippets/firestore-next/test-firestore/input_stages.js new file mode 100644 index 00000000..eaa08aad --- /dev/null +++ b/snippets/firestore-next/test-firestore/input_stages.js @@ -0,0 +1,25 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START input_stages_modular] +let results; + +// Return all restaurants in San Francisco +results = await db.pipeline().collection("cities/sf/restaurants").execute(); + +// Return all restaurants +results = await db.pipeline().collectionGroup("restaurants").execute(); + +// Return all documents across all collections in the database (the entire database) +results = await db.pipeline().database().execute(); + +// Batch read of 3 documents +results = await db.pipeline().documents([ + doc(db, "cities", "SF"), + doc(db, "cities", "DC"), + doc(db, "cities", "NY") +]).execute(); +// [END input_stages_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/is_nan.js b/snippets/firestore-next/test-firestore/is_nan.js new file mode 100644 index 00000000..52879098 --- /dev/null +++ b/snippets/firestore-next/test-firestore/is_nan.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START is_nan_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("rating").isNan().as("hasInvalidRating") + ]) + .execute(); +// [END is_nan_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/is_not_nan.js b/snippets/firestore-next/test-firestore/is_not_nan.js new file mode 100644 index 00000000..b7f41c0e --- /dev/null +++ b/snippets/firestore-next/test-firestore/is_not_nan.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START is_not_nan_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("rating").isNotNan().as("hasValidRating") + ]) + .execute(); +// [END is_not_nan_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/less_or_equal.js b/snippets/firestore-next/test-firestore/less_or_equal.js new file mode 100644 index 00000000..b75c4a41 --- /dev/null +++ b/snippets/firestore-next/test-firestore/less_or_equal.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START less_or_equal_modular] +const result = await db.pipeline() + .collection("books") + .select([field("rating").lessThanOrEqual(2).as("hasBadRating")]) + .execute(); +// [END less_or_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/less_than.js b/snippets/firestore-next/test-firestore/less_than.js new file mode 100644 index 00000000..c87f5cbb --- /dev/null +++ b/snippets/firestore-next/test-firestore/less_than.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START less_than_modular] +const result = await db.pipeline() + .collection("books") + .select([field("published").lessThan(1923).as("isPublicDomainProbably")]) + .execute(); +// [END less_than_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/like.js b/snippets/firestore-next/test-firestore/like.js new file mode 100644 index 00000000..e94caa9a --- /dev/null +++ b/snippets/firestore-next/test-firestore/like.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START like_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("genre").like("%Fiction") + .as("anyFiction") + ]) + .execute(); +// [END like_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/ln_function.js b/snippets/firestore-next/test-firestore/ln_function.js new file mode 100644 index 00000000..5f284f07 --- /dev/null +++ b/snippets/firestore-next/test-firestore/ln_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START ln_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("rating").ln().as("lnRating")]) + .execute(); +// [END ln_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/log_function.js b/snippets/firestore-next/test-firestore/log_function.js new file mode 100644 index 00000000..0ef8badd --- /dev/null +++ b/snippets/firestore-next/test-firestore/log_function.js @@ -0,0 +1,9 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START log_function_modular] +// Not supported on JS +// [END log_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/map_get.js b/snippets/firestore-next/test-firestore/map_get.js new file mode 100644 index 00000000..30d6645b --- /dev/null +++ b/snippets/firestore-next/test-firestore/map_get.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START map_get_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("awards").mapGet("pulitzer").as("hasPulitzerAward") + ]) + .execute(); +// [END map_get_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/map_merge_overwrite.js b/snippets/firestore-next/test-firestore/map_merge_overwrite.js new file mode 100644 index 00000000..ee6fb613 --- /dev/null +++ b/snippets/firestore-next/test-firestore/map_merge_overwrite.js @@ -0,0 +1,9 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START map_merge_overwrite_modular] +// unsupported in client SDKs for now +// [END map_merge_overwrite_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/max_function.js b/snippets/firestore-next/test-firestore/max_function.js new file mode 100644 index 00000000..96af6ee6 --- /dev/null +++ b/snippets/firestore-next/test-firestore/max_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START max_function_modular] +const result = await db.pipeline() + .collection("books") + .aggregate([field("price").maximum().as("maximumPrice")]) + .execute(); +// [END max_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/max_logical_function.js b/snippets/firestore-next/test-firestore/max_logical_function.js new file mode 100644 index 00000000..6a985180 --- /dev/null +++ b/snippets/firestore-next/test-firestore/max_logical_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START max_logical_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("rating").logicalMaximum([1]).as("flooredRating") + ]) + .execute(); +// [END max_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/min_function.js b/snippets/firestore-next/test-firestore/min_function.js new file mode 100644 index 00000000..bb57e140 --- /dev/null +++ b/snippets/firestore-next/test-firestore/min_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START min_function_modular] +const result = await db.pipeline() + .collection("books") + .aggregate([field("price").minimum().as("minimumPrice")]) + .execute(); +// [END min_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/min_logical_function.js b/snippets/firestore-next/test-firestore/min_logical_function.js new file mode 100644 index 00000000..d0cfaa56 --- /dev/null +++ b/snippets/firestore-next/test-firestore/min_logical_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START min_logical_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("rating").logicalMinimum([5]).as("cappedRating") + ]) + .execute(); +// [END min_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/mod_function.js b/snippets/firestore-next/test-firestore/mod_function.js new file mode 100644 index 00000000..67e07d05 --- /dev/null +++ b/snippets/firestore-next/test-firestore/mod_function.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START mod_function_modular] +const displayCapacity = 1000; +const result = await db.pipeline() + .collection("books") + .select([field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")]) + .execute(); +// [END mod_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/multiply_function.js b/snippets/firestore-next/test-firestore/multiply_function.js new file mode 100644 index 00000000..ec712764 --- /dev/null +++ b/snippets/firestore-next/test-firestore/multiply_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START multiply_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("price").multiply(field("soldBooks")).as("revenue")]) + .execute(); +// [END multiply_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/not_eq_any.js b/snippets/firestore-next/test-firestore/not_eq_any.js new file mode 100644 index 00000000..89568cad --- /dev/null +++ b/snippets/firestore-next/test-firestore/not_eq_any.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START not_eq_any_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("author").notEqualAny(["George Orwell", "F. Scott Fitzgerald"]) + .as("byExcludedAuthors") + ]) + .execute(); +// [END not_eq_any_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/not_equal.js b/snippets/firestore-next/test-firestore/not_equal.js new file mode 100644 index 00000000..49c8e915 --- /dev/null +++ b/snippets/firestore-next/test-firestore/not_equal.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START not_equal_modular] +const result = await db.pipeline() + .collection("books") + .select([field("title").notEqual("1984").as("not1984")]) + .execute(); +// [END not_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/not_function.js b/snippets/firestore-next/test-firestore/not_function.js new file mode 100644 index 00000000..f9301f4f --- /dev/null +++ b/snippets/firestore-next/test-firestore/not_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START not_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + (field("tags").arrayContains("nonfiction").not()) + .as("isFiction") + ]) + .execute(); +// [END not_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/or_function.js b/snippets/firestore-next/test-firestore/or_function.js new file mode 100644 index 00000000..c4c93480 --- /dev/null +++ b/snippets/firestore-next/test-firestore/or_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START or_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + or(field("genre").equal("Fantasy"), (field("tags").arrayContains("adventure"))) + .as("matchesSearchFilters") + ]) + .execute(); +// [END or_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js b/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js new file mode 100644 index 00000000..ef9f3211 --- /dev/null +++ b/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pagination_not_supported_preview_modular] +// Existing pagination via `startAt()` +const query = db.collection("cities").orderBy("population").startAt(1000000); + +// Private preview workaround using pipelines +const pipeline = db.pipeline() + .collection("cities") + .where(field("population").greaterThanOrEqual(1000000)) + .sort([field("population").descending()]); +// [END pagination_not_supported_preview_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pipeline_concepts.js b/snippets/firestore-next/test-firestore/pipeline_concepts.js new file mode 100644 index 00000000..64712f9d --- /dev/null +++ b/snippets/firestore-next/test-firestore/pipeline_concepts.js @@ -0,0 +1,18 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pipeline_concepts_modular] +const pipeline = db.pipeline() + // Step 1: Start a query with collection scope + .collection("cities") + // Step 2: Filter the collection + .where(field("population").greaterThan(100000)) + // Step 3: Sort the remaining documents + .sort([field("name").ascending()]) + // Step 4: Return the top 10. Note applying the limit earlier in the + // pipeline would have unintentional results. + .limit(10); +// [END pipeline_concepts_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pipeline_initialization.js b/snippets/firestore-next/test-firestore/pipeline_initialization.js new file mode 100644 index 00000000..5832a720 --- /dev/null +++ b/snippets/firestore-next/test-firestore/pipeline_initialization.js @@ -0,0 +1,11 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pipeline_initialization_modular] +import { getFirestore } from "@firebase/firestore"; +const database = getFirestore(app, "enterprise"); +const pipeline = database.pipeline(); +// [END pipeline_initialization_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pipeline_where.js b/snippets/firestore-next/test-firestore/pipeline_where.js new file mode 100644 index 00000000..31d7a64e --- /dev/null +++ b/snippets/firestore-next/test-firestore/pipeline_where.js @@ -0,0 +1,18 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pipeline_where_modular] +let results; + +results = await db.pipeline().collection("books") + .where(field("rating").equal(5)) + .where(field("published").lessThan(1900)) + .execute(); + +results = await db.pipeline().collection("books") + .where(and(field("rating").equal(5), (field("published").lessThan(1900)))) + .execute(); +// [END pipeline_where_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pow_function.js b/snippets/firestore-next/test-firestore/pow_function.js new file mode 100644 index 00000000..3365c46d --- /dev/null +++ b/snippets/firestore-next/test-firestore/pow_function.js @@ -0,0 +1,27 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pow_function_modular] +const googleplex = { latitude: 37.4221, longitude: 122.0853 }; +const result = await db.pipeline() + .collection("cities") + .addFields([ + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ]) + .select([ + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ]) + .execute(); +// [END pow_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/query_example.js b/snippets/firestore-next/test-firestore/query_example.js new file mode 100644 index 00000000..dce401d6 --- /dev/null +++ b/snippets/firestore-next/test-firestore/query_example.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START query_example_modular] +const results = await db.pipeline() + .collection("books") + .where(field("published").lessThan(1900)) + .where(field("genre").equal("Science Fiction")) + .where(field("rating").greaterThan(4.3)) + .sort([field("published").descending()]) + .execute(); +// [END query_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/regex_contains.js b/snippets/firestore-next/test-firestore/regex_contains.js new file mode 100644 index 00000000..2dfdf6fd --- /dev/null +++ b/snippets/firestore-next/test-firestore/regex_contains.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START regex_contains_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("title").regexContains("Firestore (Enterprise|Standard)") + .as("isFirestoreRelated") + ]) + .execute(); +// [END regex_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/regex_match.js b/snippets/firestore-next/test-firestore/regex_match.js new file mode 100644 index 00000000..64061e57 --- /dev/null +++ b/snippets/firestore-next/test-firestore/regex_match.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START regex_match_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("title").regexMatch("Firestore (Enterprise|Standard)") + .as("isFirestoreExactly") + ]) + .execute(); +// [END regex_match_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/round_function.js b/snippets/firestore-next/test-firestore/round_function.js new file mode 100644 index 00000000..1e4928f8 --- /dev/null +++ b/snippets/firestore-next/test-firestore/round_function.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START round_function_modular] +const result = await db.pipeline() + .collection("books") + .select([field("soldBooks").multiply(field("price")).round().as("partialRevenue")]) + .aggregate([field("partialRevenue").sum().as("totalRevenue")]) + .execute(); +// [END round_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sample_example.js b/snippets/firestore-next/test-firestore/sample_example.js new file mode 100644 index 00000000..6f89dce3 --- /dev/null +++ b/snippets/firestore-next/test-firestore/sample_example.js @@ -0,0 +1,25 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sample_example_modular] +let results; + +// Get a sample of 100 documents in a database +results = await db.pipeline() + .database() + .sample(100) + .execute(); + +// Randomly shuffle a list of 3 documents +results = await db.pipeline() + .documents([ + doc(db, "cities", "SF"), + doc(db, "cities", "NY"), + doc(db, "cities", "DC"), + ]) + .sample(3) + .execute(); +// [END sample_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sample_percent.js b/snippets/firestore-next/test-firestore/sample_percent.js new file mode 100644 index 00000000..fae40af4 --- /dev/null +++ b/snippets/firestore-next/test-firestore/sample_percent.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sample_percent_modular] +// Get a sample of on average 50% of the documents in the database +const results = await db.pipeline() + .database() + .sample({ percentage: 0.5 }) + .execute(); +// [END sample_percent_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sort.js b/snippets/firestore-next/test-firestore/sort.js new file mode 100644 index 00000000..ec551584 --- /dev/null +++ b/snippets/firestore-next/test-firestore/sort.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sort_modular] +const results = await db.pipeline() + .collection("books") + .sort([ + field("release_date").descending(), field("author").ascending() + ]) + .execute(); +// [END sort_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sort_comparison.js b/snippets/firestore-next/test-firestore/sort_comparison.js new file mode 100644 index 00000000..d4e2ad49 --- /dev/null +++ b/snippets/firestore-next/test-firestore/sort_comparison.js @@ -0,0 +1,17 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sort_comparison_modular] +const query = db.collection("cities") + .orderBy("state") + .orderBy("population", "desc"); + +const pipeline = db.pipeline() + .collection("books") + .sort([ + field("release_date").descending(), field("author").ascending() + ]); +// [END sort_comparison_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sparse_index_example.js b/snippets/firestore-next/test-firestore/sparse_index_example.js new file mode 100644 index 00000000..9318e95b --- /dev/null +++ b/snippets/firestore-next/test-firestore/sparse_index_example.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sparse_index_example_modular] +const results = await db.pipeline() + .collection("books") + .where(field("category").like("%fantasy%")) + .execute(); +// [END sparse_index_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sqrt_function.js b/snippets/firestore-next/test-firestore/sqrt_function.js new file mode 100644 index 00000000..3e78d065 --- /dev/null +++ b/snippets/firestore-next/test-firestore/sqrt_function.js @@ -0,0 +1,27 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sqrt_function_modular] +const googleplex = { latitude: 37.4221, longitude: 122.0853 }; +const result = await db.pipeline() + .collection("cities") + .addFields([ + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ]) + .select([ + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ]) + .execute(); +// [END sqrt_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/starts_with.js b/snippets/firestore-next/test-firestore/starts_with.js new file mode 100644 index 00000000..ca8db963 --- /dev/null +++ b/snippets/firestore-next/test-firestore/starts_with.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START starts_with_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("title").startsWith("The") + .as("needsSpecialAlphabeticalSort") + ]) + .execute(); +// [END starts_with_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/str_concat.js b/snippets/firestore-next/test-firestore/str_concat.js new file mode 100644 index 00000000..303b3788 --- /dev/null +++ b/snippets/firestore-next/test-firestore/str_concat.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START str_concat_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("title").stringConcat(" by ", field("author")) + .as("fullyQualifiedTitle") + ]) + .execute(); +// [END str_concat_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/str_reverse.js b/snippets/firestore-next/test-firestore/str_reverse.js new file mode 100644 index 00000000..95d8123e --- /dev/null +++ b/snippets/firestore-next/test-firestore/str_reverse.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START str_reverse_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("name").reverse().as("reversedName") + ]) + .execute(); +// [END str_reverse_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/string_contains.js b/snippets/firestore-next/test-firestore/string_contains.js new file mode 100644 index 00000000..7fff5f30 --- /dev/null +++ b/snippets/firestore-next/test-firestore/string_contains.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START string_contains_modular] +const result = await db.pipeline() + .collection("articles") + .select([ + field("body").stringContains("Firestore") + .as("isFirestoreRelated") + ]) + .execute(); +// [END string_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/substr_function.js b/snippets/firestore-next/test-firestore/substr_function.js new file mode 100644 index 00000000..2e34484c --- /dev/null +++ b/snippets/firestore-next/test-firestore/substr_function.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START substr_function_modular] +const result = await db.pipeline() + .collection("books") + .where(field("title").startsWith("The ")) + .select([ + field("title").substring(4) + .as("titleWithoutLeadingThe") + ]) + .execute(); +// [END substr_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/subtract_function.js b/snippets/firestore-next/test-firestore/subtract_function.js new file mode 100644 index 00000000..27cc2ab0 --- /dev/null +++ b/snippets/firestore-next/test-firestore/subtract_function.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START subtract_function_modular] +const storeCredit = 7; +const result = await db.pipeline() + .collection("books") + .select([field("price").subtract(constant(storeCredit)).as("totalCost")]) + .execute(); +// [END subtract_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sum_function.js b/snippets/firestore-next/test-firestore/sum_function.js new file mode 100644 index 00000000..d57c5895 --- /dev/null +++ b/snippets/firestore-next/test-firestore/sum_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sum_function_modular] +const result = await db.pipeline() + .collection("cities") + .aggregate([field("population").sum().as("totalPopulation")]) + .execute(); +// [END sum_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_add.js b/snippets/firestore-next/test-firestore/timestamp_add.js new file mode 100644 index 00000000..f96789bd --- /dev/null +++ b/snippets/firestore-next/test-firestore/timestamp_add.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_add_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAt").timestampAdd("day", 3653).as("expiresAt") + ]) + .execute(); +// [END timestamp_add_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_sub.js b/snippets/firestore-next/test-firestore/timestamp_sub.js new file mode 100644 index 00000000..8fd40458 --- /dev/null +++ b/snippets/firestore-next/test-firestore/timestamp_sub.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_sub_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("expiresAt").timestampSubtract("day", 14).as("sendWarningTimestamp") + ]) + .execute(); +// [END timestamp_sub_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_unix_micros.js b/snippets/firestore-next/test-firestore/timestamp_unix_micros.js new file mode 100644 index 00000000..4519c232 --- /dev/null +++ b/snippets/firestore-next/test-firestore/timestamp_unix_micros.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_unix_micros_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("dateString").timestampToUnixMicros().as("unixMicros") + ]) + .execute(); +// [END timestamp_unix_micros_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_unix_millis.js b/snippets/firestore-next/test-firestore/timestamp_unix_millis.js new file mode 100644 index 00000000..f4a7a6c4 --- /dev/null +++ b/snippets/firestore-next/test-firestore/timestamp_unix_millis.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_unix_millis_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("dateString").timestampToUnixMillis().as("unixMillis") + ]) + .execute(); +// [END timestamp_unix_millis_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_unix_seconds.js b/snippets/firestore-next/test-firestore/timestamp_unix_seconds.js new file mode 100644 index 00000000..bf70eea7 --- /dev/null +++ b/snippets/firestore-next/test-firestore/timestamp_unix_seconds.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_unix_seconds_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("dateString").timestampToUnixSeconds().as("unixSeconds") + ]) + .execute(); +// [END timestamp_unix_seconds_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/to_lower.js b/snippets/firestore-next/test-firestore/to_lower.js new file mode 100644 index 00000000..7d41a264 --- /dev/null +++ b/snippets/firestore-next/test-firestore/to_lower.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START to_lower_modular] +const result = await db.pipeline() + .collection("authors") + .select([ + field("genre").toLower().equal("fantasy") + .as("isFantasy") + ]) + .execute(); +// [END to_lower_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/to_upper.js b/snippets/firestore-next/test-firestore/to_upper.js new file mode 100644 index 00000000..5290792f --- /dev/null +++ b/snippets/firestore-next/test-firestore/to_upper.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START to_upper_modular] +const result = await db.pipeline() + .collection("authors") + .select([ + field("name").toUpper() + .as("uppercaseName") + ]) + .execute(); +// [END to_upper_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/trim_function.js b/snippets/firestore-next/test-firestore/trim_function.js new file mode 100644 index 00000000..24d8fb19 --- /dev/null +++ b/snippets/firestore-next/test-firestore/trim_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START trim_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("name").trim().as("whitespaceTrimmedName") + ]) + .execute(); +// [END trim_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/union_stage.js b/snippets/firestore-next/test-firestore/union_stage.js new file mode 100644 index 00000000..8d87329f --- /dev/null +++ b/snippets/firestore-next/test-firestore/union_stage.js @@ -0,0 +1,17 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START union_stage_modular] +const results = await db.pipeline() + .collection("cities/SF/restaurants") + .where(field("type").equal("Chinese")) + .union(db.pipeline() + .collection("cities/NY/restaurants") + .where(field("type").equal("Italian"))) + .where(field("rating").greaterThanOrEqual(4.5)) + .sort([field("__name__").descending()]) + .execute(); +// [END union_stage_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/union_stage_stable.js b/snippets/firestore-next/test-firestore/union_stage_stable.js new file mode 100644 index 00000000..9eebd035 --- /dev/null +++ b/snippets/firestore-next/test-firestore/union_stage_stable.js @@ -0,0 +1,17 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START union_stage_stable_modular] +const results = await db.pipeline() + .collection("cities/SF/restaurants") + .where(field("type").equal("Chinese")) + .union(db.pipeline() + .collection("cities/NY/restaurants") + .where(field("type").equal("Italian")), { stable: true }) + .where(field("rating").greaterThanOrEqual(4.5)) + .sort([field("__name__").descending()]) + .execute(); +// [END union_stage_stable_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unix_micros_timestamp.js b/snippets/firestore-next/test-firestore/unix_micros_timestamp.js new file mode 100644 index 00000000..da881fb8 --- /dev/null +++ b/snippets/firestore-next/test-firestore/unix_micros_timestamp.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unix_micros_timestamp_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAtMicros").unixMicrosToTimestamp().as("createdAtString") + ]) + .execute(); +// [END unix_micros_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unix_millis_timestamp.js b/snippets/firestore-next/test-firestore/unix_millis_timestamp.js new file mode 100644 index 00000000..bfb1b196 --- /dev/null +++ b/snippets/firestore-next/test-firestore/unix_millis_timestamp.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unix_millis_timestamp_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAtMillis").unixMillisToTimestamp().as("createdAtString") + ]) + .execute(); +// [END unix_millis_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unix_seconds_timestamp.js b/snippets/firestore-next/test-firestore/unix_seconds_timestamp.js new file mode 100644 index 00000000..4ebf8fad --- /dev/null +++ b/snippets/firestore-next/test-firestore/unix_seconds_timestamp.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unix_seconds_timestamp_modular] +const result = await db.pipeline() + .collection("documents") + .select([ + field("createdAtSeconds").unixSecondsToTimestamp().as("createdAtString") + ]) + .execute(); +// [END unix_seconds_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unnest_edge_cases.js b/snippets/firestore-next/test-firestore/unnest_edge_cases.js new file mode 100644 index 00000000..2d666555 --- /dev/null +++ b/snippets/firestore-next/test-firestore/unnest_edge_cases.js @@ -0,0 +1,21 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unnest_edge_cases_modular] +// Input +// { identifier : 1, neighbors: [ "Alice", "Cathy" ] } +// { identifier : 2, neighbors: [] } +// { identifier : 3, neighbors: "Bob" } +const results = await db.pipeline() + .database() + .unnest(field("neighbors").as("unnestedNeighbors"), { indexField: "index" }) + .execute(); + +// Output +// { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Alice", index: 0 } +// { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Cathy", index: 1 } +// { identifier: 3, neighbors: "Bob", index: null} +// [END unnest_edge_cases_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unnest_stage.js b/snippets/firestore-next/test-firestore/unnest_stage.js new file mode 100644 index 00000000..e8cfedb1 --- /dev/null +++ b/snippets/firestore-next/test-firestore/unnest_stage.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unnest_stage_modular] +const results = await db.pipeline() + .database() + .unnest(field("arrayField").as("unnestedArrayField"), { indexField: "index" }) + .execute(); +// [END unnest_stage_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/vector_length.js b/snippets/firestore-next/test-firestore/vector_length.js new file mode 100644 index 00000000..10f085cf --- /dev/null +++ b/snippets/firestore-next/test-firestore/vector_length.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START vector_length_modular] +const result = await db.pipeline() + .collection("books") + .select([ + field("embedding").vectorLength().as("vectorLength") + ]) + .execute(); +// [END vector_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/xor_function.js b/snippets/firestore-next/test-firestore/xor_function.js new file mode 100644 index 00000000..26c9363c --- /dev/null +++ b/snippets/firestore-next/test-firestore/xor_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START xor_function_modular] +const result = await db.pipeline() + .collection("books") + .select([ + xor(field("tags").arrayContains("magic"), (field("tags").arrayContains("nonfiction"))) + .as("matchesSearchFilters") + ]) + .execute(); +// [END xor_function_modular] \ No newline at end of file From af573149d16fa587b4ee1903d713b4894d6c7246 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Fri, 31 Oct 2025 16:34:00 -0700 Subject: [PATCH 03/19] remove nan snippets --- firestore-next/test.firestore.js | 24 ------------------- .../firestore-next/test-firestore/is_nan.js | 14 ----------- .../test-firestore/is_not_nan.js | 14 ----------- 3 files changed, 52 deletions(-) delete mode 100644 snippets/firestore-next/test-firestore/is_nan.js delete mode 100644 snippets/firestore-next/test-firestore/is_not_nan.js diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index a31b9e71..a2ddaa18 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -2220,30 +2220,6 @@ describe("firestore-pipelines", () => { console.log(result); } - async function isNaNFunction() { - // [START is_nan] - const result = await db.pipeline() - .collection("books") - .select([ - field("rating").isNan().as("hasInvalidRating") - ]) - .execute(); - // [END is_nan] - console.log(result); - } - - async function isNotNaNFunction() { - // [START is_not_nan] - const result = await db.pipeline() - .collection("books") - .select([ - field("rating").isNotNan().as("hasValidRating") - ]) - .execute(); - // [END is_not_nan] - console.log(result); - } - async function maxLogicalFunction() { // [START max_logical_function] const result = await db.pipeline() diff --git a/snippets/firestore-next/test-firestore/is_nan.js b/snippets/firestore-next/test-firestore/is_nan.js deleted file mode 100644 index 52879098..00000000 --- a/snippets/firestore-next/test-firestore/is_nan.js +++ /dev/null @@ -1,14 +0,0 @@ -// This snippet file was generated by processing the source file: -// ./firestore-next/test.firestore.js -// -// To update the snippets in this file, edit the source and then run -// 'npm run snippets'. - -// [START is_nan_modular] -const result = await db.pipeline() - .collection("books") - .select([ - field("rating").isNan().as("hasInvalidRating") - ]) - .execute(); -// [END is_nan_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/is_not_nan.js b/snippets/firestore-next/test-firestore/is_not_nan.js deleted file mode 100644 index b7f41c0e..00000000 --- a/snippets/firestore-next/test-firestore/is_not_nan.js +++ /dev/null @@ -1,14 +0,0 @@ -// This snippet file was generated by processing the source file: -// ./firestore-next/test.firestore.js -// -// To update the snippets in this file, edit the source and then run -// 'npm run snippets'. - -// [START is_not_nan_modular] -const result = await db.pipeline() - .collection("books") - .select([ - field("rating").isNotNan().as("hasValidRating") - ]) - .execute(); -// [END is_not_nan_modular] \ No newline at end of file From c8455f43e7dfd124832b17876bd4b1a7783452b8 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Tue, 4 Nov 2025 14:41:55 -0800 Subject: [PATCH 04/19] add basic read snippet --- firestore-next/test.firestore.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index a2ddaa18..b4db6eb4 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1352,6 +1352,22 @@ describe("firestore-pipelines", () => { db = getFirestore(app, "enterprise"); }); + async function basicRead() { + const readDataPipeline = db.pipeline() + .collection("users") + + // Execute the pipeline and handle the result + readDataPipeline.execute() + .then((querySnapshot) => { + querySnapshot.forEach((result) => { + console.log(`${result.id} => ${result.data()}`); + }); + }) + .catch((error) => { + console.error("Error getting documents: ", error); + }); + } + function pipelineConcepts() { // [START pipeline_concepts] const pipeline = db.pipeline() From c9724108bff5301b205955f6b3f9fdcbed3af881 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Tue, 4 Nov 2025 14:45:44 -0800 Subject: [PATCH 05/19] add snippet comments --- firestore-next/test.firestore.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index b4db6eb4..2a958dbf 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1353,6 +1353,7 @@ describe("firestore-pipelines", () => { }); async function basicRead() { + // [START basic_read] const readDataPipeline = db.pipeline() .collection("users") @@ -1366,6 +1367,7 @@ describe("firestore-pipelines", () => { .catch((error) => { console.error("Error getting documents: ", error); }); + // [END basic_read] } function pipelineConcepts() { From ca5f30253a9891f7f6a5872cb85c05e02eb1e86a Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Tue, 4 Nov 2025 14:46:09 -0800 Subject: [PATCH 06/19] run snippets --- .../test-firestore/basic_read.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 snippets/firestore-next/test-firestore/basic_read.js diff --git a/snippets/firestore-next/test-firestore/basic_read.js b/snippets/firestore-next/test-firestore/basic_read.js new file mode 100644 index 00000000..10adb205 --- /dev/null +++ b/snippets/firestore-next/test-firestore/basic_read.js @@ -0,0 +1,21 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START basic_read_modular] +const readDataPipeline = db.pipeline() + .collection("users") + +// Execute the pipeline and handle the result +readDataPipeline.execute() + .then((querySnapshot) => { + querySnapshot.forEach((result) => { + console.log(`${result.id} => ${result.data()}`); + }); + }) + .catch((error) => { + console.error("Error getting documents: ", error); + }); +// [END basic_read_modular] \ No newline at end of file From 6d20c7021177a8f6f2ea4b5e622160ba5c8b1bab Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Wed, 5 Nov 2025 11:31:54 -0800 Subject: [PATCH 07/19] use new prerelease tag --- firestore-next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firestore-next/package.json b/firestore-next/package.json index de740d5c..6480960d 100644 --- a/firestore-next/package.json +++ b/firestore-next/package.json @@ -6,7 +6,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@firebase/firestore": "https://firebasestorage.googleapis.com/v0/b/firestore-sdk-nightly.appspot.com/o/pipeline-sdk-builds%2Fweb%2Ffirebase-firestore-v4.9.2-piplines.prerelease.3.tgz?alt=media", + "@firebase/firestore": "eap-firestore-pipelines", "firebase": "^12.4.0", "geofire-common": "^6.0.0" }, From e67c4eab59ba33fdae9474a66200fed395a032be Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Wed, 5 Nov 2025 17:07:38 -0800 Subject: [PATCH 08/19] use correct typings and fix build errors --- firestore-next/test.firestore.js | 717 ++++++++++++++++--------------- 1 file changed, 363 insertions(+), 354 deletions(-) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 2a958dbf..398a882b 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1325,7 +1325,16 @@ describe("firestore", () => { }); describe("firestore-pipelines", () => { - const { getFirestore, doc } = require("@firebase/firestore") + const { + Firestore, + collection, + doc, + getFirestore, + orderBy, + query, + setDoc, + startAt + } = require("@firebase/firestore") const { Pipeline, field, @@ -1335,11 +1344,12 @@ describe("firestore-pipelines", () => { and, or, xor, - conditional + conditional, + execute } = require("@firebase/firestore/pipelines"); - let db; let app; + /** @type {Firestore} */ let db; before(() => { const { initializeApp } = require("firebase/app"); @@ -1355,18 +1365,17 @@ describe("firestore-pipelines", () => { async function basicRead() { // [START basic_read] const readDataPipeline = db.pipeline() - .collection("users") + .collection("users"); // Execute the pipeline and handle the result - readDataPipeline.execute() - .then((querySnapshot) => { - querySnapshot.forEach((result) => { - console.log(`${result.id} => ${result.data()}`); - }); - }) - .catch((error) => { - console.error("Error getting documents: ", error); + try { + const querySnapshot = await execute(readDataPipeline); + querySnapshot.results.forEach((result) => { + console.log(`${result.id} => ${result.data()}`); }); + } catch (error) { + console.error("Error getting documents: ", error); + } // [END basic_read] } @@ -1378,7 +1387,7 @@ describe("firestore-pipelines", () => { // Step 2: Filter the collection .where(field("population").greaterThan(100000)) // Step 3: Sort the remaining documents - .sort([field("name").ascending()]) + .sort(field("name").ascending()) // Step 4: Return the top 10. Note applying the limit earlier in the // pipeline would have unintentional results. .limit(10); @@ -1389,6 +1398,7 @@ describe("firestore-pipelines", () => { function pipelineInitialization() { // [START pipeline_initialization] const { getFirestore } = require("@firebase/firestore"); + const { execute } = require("@firebase/firestore/pipelines"); const database = getFirestore(app, "enterprise"); const pipeline = database.pipeline(); // [END pipeline_initialization] @@ -1409,20 +1419,20 @@ describe("firestore-pipelines", () => { let results; // Return all restaurants in San Francisco - results = await db.pipeline().collection("cities/sf/restaurants").execute(); + results = await execute(db.pipeline().collection("cities/sf/restaurants")); // Return all restaurants - results = await db.pipeline().collectionGroup("restaurants").execute(); + results = await execute(db.pipeline().collectionGroup("restaurants")); // Return all documents across all collections in the database (the entire database) - results = await db.pipeline().database().execute(); + results = await execute(db.pipeline().database()); // Batch read of 3 documents - results = await db.pipeline().documents([ + results = await execute(db.pipeline().documents([ doc(db, "cities", "SF"), doc(db, "cities", "DC"), doc(db, "cities", "NY") - ]).execute(); + ])); // [END input_stages] console.log(results); } @@ -1431,72 +1441,69 @@ describe("firestore-pipelines", () => { // [START pipeline_where] let results; - results = await db.pipeline().collection("books") + results = await execute(db.pipeline().collection("books") .where(field("rating").equal(5)) .where(field("published").lessThan(1900)) - .execute(); + ); - results = await db.pipeline().collection("books") + results = await execute(db.pipeline().collection("books") .where(and(field("rating").equal(5), (field("published").lessThan(1900)))) - .execute(); + ); // [END pipeline_where] console.log(results); } async function aggregateGroups() { // [START aggregate_groups] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("books") - .aggregate([ + .aggregate( field("rating").average().as("avg_rating") - ], { - groups: [ - field("genre") - ] - }) - .execute(); + ) + .distinct(field("genre")) + ); // [END aggregate_groups] console.log(results); } async function aggregateDistinct() { // [START aggregate_distinct] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("books") - .distinct([ + .distinct( field("author").toUpper().as("author"), field("genre") - ]) - .execute(); + ) + ); // [END aggregate_distinct] console.log(results); } async function sort() { // [START sort] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("books") - .sort([ + .sort( field("release_date").descending(), field("author").ascending() - ]) - .execute(); + ) + ); // [END sort] console.log(results); } function sortComparison() { // [START sort_comparison] - const query = db.collection("cities") - .orderBy("state") - .orderBy("population", "desc"); + const q = query(collection(db, "cities"), + orderBy("state"), + orderBy("population", "desc")); const pipeline = db.pipeline() .collection("books") - .sort([ + .sort( field("release_date").descending(), field("author").ascending() - ]); + ); // [END sort_comparison] - console.log(query); + console.log(q); console.log(pipeline); } @@ -1506,63 +1513,63 @@ describe("firestore-pipelines", () => { // Type 1: Scalar (for use in non-aggregation stages) // Example: Return the min store price for each book. - results = await db.pipeline().collection("books") - .select([ + results = await execute(db.pipeline().collection("books") + .select( field("current").logicalMinimum(["updated"]).as("price_min") - ]) - .execute(); + ) + ); // Type 2: Aggregation (for use in aggregate stages) // Example: Return the min price of all books. - results = await db.pipeline().collection("books") - .aggregate([field("price").minimum().as("min_price")]) - .execute(); + results = await execute(db.pipeline().collection("books") + .aggregate(field("price").minimum().as("min_price")) + ); // [END functions_example] console.log(results); } async function creatingIndexes() { // [START query_example] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("books") .where(field("published").lessThan(1900)) .where(field("genre").equal("Science Fiction")) .where(field("rating").greaterThan(4.3)) - .sort([field("published").descending()]) - .execute(); + .sort(field("published").descending()) + ); // [END query_example] console.log(results); } async function sparseIndexes() { // [START sparse_index_example] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("books") .where(field("category").like("%fantasy%")) - .execute(); + ); // [END sparse_index_example] console.log(results); } async function sparseIndexes2() { // [START sparse_index_example_2] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("books") - .sort([field("release_date").ascending()]) - .execute(); + .sort(field("release_date").ascending()) + ); // [END sparse_index_example_2] console.log(results); } async function coveredQuery() { // [START covered_query] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("books") .where(field("category").like("%fantasy%")) .where(field("title").exists()) .where(field("author").exists()) - .select([field("title"), field("author")]) - .execute(); + .select(field("title"), field("author")) + ); // [END covered_query] console.log(results); } @@ -1570,34 +1577,35 @@ describe("firestore-pipelines", () => { function pagination() { // [START pagination_not_supported_preview] // Existing pagination via `startAt()` - const query = db.collection("cities").orderBy("population").startAt(1000000); + const q = // db.collection("cities").orderBy("population").startAt(1000000); + query(collection(db, "cities"), orderBy("population"), startAt(1000000)); // Private preview workaround using pipelines const pipeline = db.pipeline() .collection("cities") .where(field("population").greaterThanOrEqual(1000000)) - .sort([field("population").descending()]); + .sort(field("population").descending()); // [END pagination_not_supported_preview] - console.log(query); + console.log(q); console.log(pipeline); } async function collectionStage() { // [START collection_example] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("users/bob/games") - .sort([field("name").ascending()]) - .execute(); + .sort(field("name").ascending()) + ); // [END collection_example] console.log(results); } async function collectionGroupStage() { // [START collection_group_example] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collectionGroup("games") - .sort([field("name").ascending()]) - .execute(); + .sort(field("name").ascending()) + ); // [END collection_group_example] console.log(results); } @@ -1605,29 +1613,30 @@ describe("firestore-pipelines", () => { async function databaseStage() { // [START database_example] // Count all documents in the database - const results = await db.pipeline() + const results = await execute(db.pipeline() .database() - .aggregate([countAll().as("total")]) - .execute(); + .aggregate(countAll().as("total")) + ); // [END database_example] console.log(results); } async function documentsStage() { // [START documents_example] - const results = await db.pipeline() + const results = await execute(db.pipeline() .documents([ doc(db, "cities", "SF"), doc(db, "cities", "DC"), doc(db, "cities", "NY") - ]).execute(); + ]) + ); // [END documents_example] console.log(results); } async function replaceWithStage() { // [START initial_data] - await db.collection("cities").doc("SF").set({ + await setDoc(doc(collection(db, "cities"), "SF"), { "name": "San Francisco", "population": 800000, "location": { @@ -1635,7 +1644,7 @@ describe("firestore-pipelines", () => { "state": "California" } }); - await db.collection("cities").doc("TO").set({ + await setDoc(doc(collection(db, "cities"), "TO"), { "name": "Toronto", "population": 3000000, "province": "ON", @@ -1644,23 +1653,23 @@ describe("firestore-pipelines", () => { "province": "Ontario" } }); - await db.collection("cities").doc("NY").set({ + await setDoc(doc(collection(db, "cities"), "NY"), { "name": "New York", "location": { "country": "USA", "state": "New York" } }); - await db.collection("cities").doc("AT").set({ + await setDoc(doc(collection(db, "cities"), "AT"), { "name": "Atlantis", }); // [END initial_data] // [START full_replace] - const names = await db.pipeline() + const names = await execute(db.pipeline() .collection("cities") - .replace(field("location")) - .execute(); + .replaceWith(field("location")) + ); // [END full_replace] // [START map_merge_overwrite] @@ -1674,20 +1683,20 @@ describe("firestore-pipelines", () => { let results; // Get a sample of 100 documents in a database - results = await db.pipeline() + results = await execute(db.pipeline() .database() .sample(100) - .execute(); + ); // Randomly shuffle a list of 3 documents - results = await db.pipeline() + results = await execute(db.pipeline() .documents([ doc(db, "cities", "SF"), doc(db, "cities", "NY"), doc(db, "cities", "DC"), ]) .sample(3) - .execute(); + ); // [END sample_example] console.log(results); } @@ -1695,50 +1704,50 @@ describe("firestore-pipelines", () => { async function samplePercent() { // [START sample_percent] // Get a sample of on average 50% of the documents in the database - const results = await db.pipeline() + const results = await execute(db.pipeline() .database() .sample({ percentage: 0.5 }) - .execute(); + ); // [END sample_percent] console.log(results); } async function unionStage() { // [START union_stage] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("cities/SF/restaurants") .where(field("type").equal("Chinese")) .union(db.pipeline() .collection("cities/NY/restaurants") .where(field("type").equal("Italian"))) .where(field("rating").greaterThanOrEqual(4.5)) - .sort([field("__name__").descending()]) - .execute(); + .sort(field("__name__").descending()) + ); // [END union_stage] console.log(results); } async function unionStageStable() { // [START union_stage_stable] - const results = await db.pipeline() + const results = await execute(db.pipeline() .collection("cities/SF/restaurants") .where(field("type").equal("Chinese")) .union(db.pipeline() .collection("cities/NY/restaurants") - .where(field("type").equal("Italian")), { stable: true }) + .where(field("type").equal("Italian")) /*, { stable: true } */) .where(field("rating").greaterThanOrEqual(4.5)) - .sort([field("__name__").descending()]) - .execute(); + .sort(field("__name__").descending()) + ); // [END union_stage_stable] console.log(results); } async function unnestStage() { // [START unnest_stage] - const results = await db.pipeline() + const results = await execute(db.pipeline() .database() - .unnest(field("arrayField").as("unnestedArrayField"), { indexField: "index" }) - .execute(); + .unnest(field("arrayField").as("unnestedArrayField"), "index") + ); // [END unnest_stage] console.log(results); } @@ -1750,10 +1759,10 @@ describe("firestore-pipelines", () => { // { identifier : 2, neighbors: [] } // { identifier : 3, neighbors: "Bob" } - const results = await db.pipeline() + const results = await execute(db.pipeline() .database() - .unnest(field("neighbors").as("unnestedNeighbors"), { indexField: "index" }) - .execute(); + .unnest(field("neighbors").as("unnestedNeighbors"), "index" ) + ); // Output // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Alice", index: 0 } @@ -1766,16 +1775,16 @@ describe("firestore-pipelines", () => { async function countFunction() { // [START count_function] // Total number of books in the collection - const countOfAll = await db.pipeline() + const countOfAll = await execute(db.pipeline() .collection("books") - .aggregate([countAll().as("count")]) - .execute(); + .aggregate(countAll().as("count")) + ); // Number of books with nonnull `ratings` field - const countField = await db.pipeline() + const countField = await execute(db.pipeline() .collection("books") - .aggregate([field("ratings").count().as("count")]) - .execute(); + .aggregate(field("ratings").count().as("count")) + ); // [END count_function] console.log(countOfAll); console.log(countField); @@ -1783,72 +1792,72 @@ describe("firestore-pipelines", () => { async function countIfFunction() { // [START count_if] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") .aggregate( field("rating").greaterThan(4).countIf().as("filteredCount") ) - .execute(); + ); // [END count_if] console.log(result); } async function countDistinctFunction() { // [START count_distinct] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") .aggregate(field("author").countDistinct().as("unique_authors")) - .execute(); + ); // [END count_distinct] console.log(result); } async function sumFunction() { // [START sum_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("cities") - .aggregate([field("population").sum().as("totalPopulation")]) - .execute(); + .aggregate(field("population").sum().as("totalPopulation")) + ); // [END sum_function] console.log(result); } async function avgFunction() { // [START avg_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("cities") - .aggregate([field("population").average().as("averagePopulation")]) - .execute(); + .aggregate(field("population").average().as("averagePopulation")) + ); // [END avg_function] console.log(result); } async function minFunction() { // [START min_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .aggregate([field("price").minimum().as("minimumPrice")]) - .execute(); + .aggregate(field("price").minimum().as("minimumPrice")) + ); // [END min_function] console.log(result); } async function maxFunction() { // [START max_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .aggregate([field("price").maximum().as("maximumPrice")]) - .execute(); + .aggregate(field("price").maximum().as("maximumPrice")) + ); // [END max_function] console.log(result); } async function addFunction() { // [START add_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("soldBooks").add(field("unsoldBooks")).as("totalBooks")]) - .execute(); + .select(field("soldBooks").add(field("unsoldBooks")).as("totalBooks")) + ); // [END add_function] console.log(result); } @@ -1856,30 +1865,30 @@ describe("firestore-pipelines", () => { async function subtractFunction() { // [START subtract_function] const storeCredit = 7; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("price").subtract(constant(storeCredit)).as("totalCost")]) - .execute(); + .select(field("price").subtract(constant(storeCredit)).as("totalCost")) + ); // [END subtract_function] console.log(result); } async function multiplyFunction() { // [START multiply_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("price").multiply(field("soldBooks")).as("revenue")]) - .execute(); + .select(field("price").multiply(field("soldBooks")).as("revenue")) + ); // [END multiply_function] console.log(result); } async function divideFunction() { // [START divide_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("ratings").divide(field("soldBooks")).as("reviewRate")]) - .execute(); + .select(field("ratings").divide(field("soldBooks")).as("reviewRate")) + ); // [END divide_function] console.log(result); } @@ -1887,10 +1896,10 @@ describe("firestore-pipelines", () => { async function modFunction() { // [START mod_function] const displayCapacity = 1000; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")]) - .execute(); + .select(field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")) + ); // [END mod_function] console.log(result); } @@ -1898,35 +1907,35 @@ describe("firestore-pipelines", () => { async function ceilFunction() { // [START ceil_function] const booksPerShelf = 100; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("unsoldBooks").divide(constant(booksPerShelf)).ceil().as("requiredShelves") - ]) - .execute(); + ) + ); // [END ceil_function] console.log(result); } async function floorFunction() { // [START floor_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .addFields([ + .addFields( field("wordCount").divide(field("pages")).floor().as("wordsPerPage") - ]) - .execute(); + ) + ); // [END floor_function] console.log(result); } async function roundFunction() { // [START round_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("soldBooks").multiply(field("price")).round().as("partialRevenue")]) - .aggregate([field("partialRevenue").sum().as("totalRevenue")]) - .execute(); + .select(field("soldBooks").multiply(field("price")).round().as("partialRevenue")) + .aggregate(field("partialRevenue").sum().as("totalRevenue")) + ); // [END round_function] console.log(result); } @@ -1934,9 +1943,9 @@ describe("firestore-pipelines", () => { async function powFunction() { // [START pow_function] const googleplex = { latitude: 37.4221, longitude: 122.0853 }; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("cities") - .addFields([ + .addFields( field("lat").subtract(constant(googleplex.latitude)) .multiply(111 /* km per degree */) .pow(2) @@ -1945,13 +1954,13 @@ describe("firestore-pipelines", () => { .multiply(111 /* km per degree */) .pow(2) .as("longitudeDifference") - ]) - .select([ + ) + .select( field("latitudeDifference").add(field("longitudeDifference")).sqrt() // Inaccurate for large distances or close to poles .as("approximateDistanceToGoogle") - ]) - .execute(); + ) + ); // [END pow_function] console.log(result); } @@ -1959,9 +1968,9 @@ describe("firestore-pipelines", () => { async function sqrtFunction() { // [START sqrt_function] const googleplex = { latitude: 37.4221, longitude: 122.0853 }; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("cities") - .addFields([ + .addFields( field("lat").subtract(constant(googleplex.latitude)) .multiply(111 /* km per degree */) .pow(2) @@ -1970,33 +1979,33 @@ describe("firestore-pipelines", () => { .multiply(111 /* km per degree */) .pow(2) .as("longitudeDifference") - ]) - .select([ + ) + .select( field("latitudeDifference").add(field("longitudeDifference")).sqrt() // Inaccurate for large distances or close to poles .as("approximateDistanceToGoogle") - ]) - .execute(); + ) + ); // [END sqrt_function] console.log(result); } async function expFunction() { // [START exp_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("rating").exp().as("expRating")]) - .execute(); + .select(field("rating").exp().as("expRating")) + ); // [END exp_function] console.log(result); } async function lnFunction() { // [START ln_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("rating").ln().as("lnRating")]) - .execute(); + .select(field("rating").ln().as("lnRating")) + ); // [END ln_function] console.log(result); } @@ -2009,443 +2018,443 @@ describe("firestore-pipelines", () => { async function arrayConcat() { // [START array_concat] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayConcat([field("subGenre")]).as("allGenres")]) - .execute(); + .select(field("genre").arrayConcat([field("subGenre")]).as("allGenres")) + ); // [END array_concat] console.log(result); } async function arrayContains() { // [START array_contains] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayContains(constant("mystery")).as("isMystery")]) - .execute(); + .select(field("genre").arrayContains(constant("mystery")).as("isMystery")) + ); // [END array_contains] console.log(result); } async function arrayContainsAll() { // [START array_contains_all] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre") .arrayContainsAll([constant("fantasy"), constant("adventure")]) .as("isFantasyAdventure") - ]) - .execute(); + ) + ); // [END array_contains_all] console.log(result); } async function arrayContainsAny() { // [START array_contains_any] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre") .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) .as("isMysteryOrFantasy") - ]) - .execute(); + ) + ); // [END array_contains_any] console.log(result); } async function arrayLength() { // [START array_length] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayLength().as("genreCount")]) - .execute(); + .select(field("genre").arrayLength().as("genreCount")) + ); // [END array_length] console.log(result); } async function arrayReverse() { // [START array_reverse] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayReverse().as("reversedGenres")]) - .execute(); + .select(field("genre").arrayReverse().as("reversedGenres")) + ); // [END array_reverse] console.log(result); } async function equalFunction() { // [START equal_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("rating").equal(5).as("hasPerfectRating")]) - .execute(); + .select(field("rating").equal(5).as("hasPerfectRating")) + ); // [END equal_function] console.log(result); } async function greaterThanFunction() { // [START greater_than] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("rating").greaterThan(4).as("hasHighRating")]) - .execute(); + .select(field("rating").greaterThan(4).as("hasHighRating")) + ); // [END greater_than] console.log(result); } async function greaterThanOrEqualToFunction() { // [START greater_or_equal] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")]) - .execute(); + .select(field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")) + ); // [END greater_or_equal] console.log(result); } async function lessThanFunction() { // [START less_than] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("published").lessThan(1923).as("isPublicDomainProbably")]) - .execute(); + .select(field("published").lessThan(1923).as("isPublicDomainProbably")) + ); // [END less_than] console.log(result); } async function lessThanOrEqualToFunction() { // [START less_or_equal] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("rating").lessThanOrEqual(2).as("hasBadRating")]) - .execute(); + .select(field("rating").lessThanOrEqual(2).as("hasBadRating")) + ); // [END less_or_equal] console.log(result); } async function notEqualFunction() { // [START not_equal] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("title").notEqual("1984").as("not1984")]) - .execute(); + .select(field("title").notEqual("1984").as("not1984")) + ); // [END not_equal] console.log(result); } async function existsFunction() { // [START exists_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([field("rating").exists().as("hasRating")]) - .execute(); + .select(field("rating").exists().as("hasRating")) + ); // [END exists_function] console.log(result); } async function andFunction() { // [START and_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( and(field("rating").greaterThan(4), (field("price").lessThan(10))) .as("under10Recommendation") - ]) - .execute(); + ) + ); // [END and_function] console.log(result); } async function orFunction() { // [START or_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( or(field("genre").equal("Fantasy"), (field("tags").arrayContains("adventure"))) .as("matchesSearchFilters") - ]) - .execute(); + ) + ); // [END or_function] console.log(result); } async function xorFunction() { // [START xor_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( xor(field("tags").arrayContains("magic"), (field("tags").arrayContains("nonfiction"))) .as("matchesSearchFilters") - ]) - .execute(); + ) + ); // [END xor_function] console.log(result); } async function notFunction() { // [START not_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( (field("tags").arrayContains("nonfiction").not()) .as("isFiction") - ]) - .execute(); + ) + ); // [END not_function] console.log(result); } async function condFunction() { // [START cond_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("tags").arrayConcat([ field("pages").greaterThan(100) .conditional(constant("longRead"), constant("shortRead")) ]).as("extendedTags") - ]) - .execute(); + ) + ); // [END cond_function] console.log(result); } async function equalAnyFunction() { // [START eq_any] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre").equalAny(["Science Fiction", "Psychological Thriller"]) .as("matchesGenreFilters") - ]) - .execute(); + ) + ); // [END eq_any] console.log(result); } async function notEqualAnyFunction() { // [START not_eq_any] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("author").notEqualAny(["George Orwell", "F. Scott Fitzgerald"]) .as("byExcludedAuthors") - ]) - .execute(); + ) + ); // [END not_eq_any] console.log(result); } async function maxLogicalFunction() { // [START max_logical_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("rating").logicalMaximum([1]).as("flooredRating") - ]) - .execute(); + ) + ); // [END max_logical_function] console.log(result); } async function minLogicalFunction() { // [START min_logical_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("rating").logicalMinimum([5]).as("cappedRating") - ]) - .execute(); + ) + ); // [END min_logical_function] console.log(result); } async function mapGetFunction() { // [START map_get] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("awards").mapGet("pulitzer").as("hasPulitzerAward") - ]) - .execute(); + ) + ); // [END map_get] console.log(result); } async function byteLengthFunction() { // [START byte_length] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").byteLength().as("titleByteLength") - ]) - .execute(); + ) + ); // [END byte_length] console.log(result); } async function charLengthFunction() { // [START char_length] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").charLength().as("titleCharLength") - ]) - .execute(); + ) + ); // [END char_length] console.log(result); } async function startsWithFunction() { // [START starts_with] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").startsWith("The") .as("needsSpecialAlphabeticalSort") - ]) - .execute(); + ) + ); // [END starts_with] console.log(result); } async function endsWithFunction() { - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("inventory/devices/laptops") - .select([ + .select( field("name").endsWith("16 inch") .as("16InLaptops") - ]) - .execute(); + ) + ); console.log(result); } async function likeFunction() { // [START like] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre").like("%Fiction") .as("anyFiction") - ]) - .execute(); + ) + ); // [END like] console.log(result); } async function regexContainsFunction() { // [START regex_contains] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("title").regexContains("Firestore (Enterprise|Standard)") .as("isFirestoreRelated") - ]) - .execute(); + ) + ); // [END regex_contains] console.log(result); } async function regexMatchFunction() { // [START regex_match] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("title").regexMatch("Firestore (Enterprise|Standard)") .as("isFirestoreExactly") - ]) - .execute(); + ) + ); // [END regex_match] console.log(result); } async function strConcatFunction() { // [START str_concat] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").stringConcat(" by ", field("author")) .as("fullyQualifiedTitle") - ]) - .execute(); + ) + ); // [END str_concat] console.log(result); } async function strContainsFunction() { // [START string_contains] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("articles") - .select([ + .select( field("body").stringContains("Firestore") .as("isFirestoreRelated") - ]) - .execute(); + ) + ); // [END string_contains] console.log(result); } async function toUpperFunction() { // [START to_upper] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("authors") - .select([ + .select( field("name").toUpper() .as("uppercaseName") - ]) - .execute(); + ) + ); // [END to_upper] console.log(result); } async function toLowerFunction() { // [START to_lower] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("authors") - .select([ + .select( field("genre").toLower().equal("fantasy") .as("isFantasy") - ]) - .execute(); + ) + ); // [END to_lower] } async function substrFunction() { // [START substr_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") .where(field("title").startsWith("The ")) - .select([ + .select( field("title").substring(4) .as("titleWithoutLeadingThe") - ]) - .execute(); + ) + ); // [END substr_function] console.log(result); } async function strReverseFunction() { // [START str_reverse] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("name").reverse().as("reversedName") - ]) - .execute(); + ) + ); // [END str_reverse] console.log(result); } async function strTrimFunction() { // [START trim_function] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("name").trim().as("whitespaceTrimmedName") - ]) - .execute(); + ) + ); // [END trim_function] console.log(result); } @@ -2460,96 +2469,96 @@ describe("firestore-pipelines", () => { async function unixMicrosToTimestampFunction() { // [START unix_micros_timestamp] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAtMicros").unixMicrosToTimestamp().as("createdAtString") - ]) - .execute(); + ) + ); // [END unix_micros_timestamp] console.log(result); } async function unixMillisToTimestampFunction() { // [START unix_millis_timestamp] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAtMillis").unixMillisToTimestamp().as("createdAtString") - ]) - .execute(); + ) + ); // [END unix_millis_timestamp] console.log(result); } async function unixSecondsToTimestampFunction() { // [START unix_seconds_timestamp] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAtSeconds").unixSecondsToTimestamp().as("createdAtString") - ]) - .execute(); + ) + ); // [END unix_seconds_timestamp] console.log(result); } async function timestampAddFunction() { // [START timestamp_add] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAt").timestampAdd("day", 3653).as("expiresAt") - ]) - .execute(); + ) + ); // [END timestamp_add] console.log(result); } async function timestampSubFunction() { // [START timestamp_sub] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("expiresAt").timestampSubtract("day", 14).as("sendWarningTimestamp") - ]) - .execute(); + ) + ); // [END timestamp_sub] console.log(result); } async function timestampToUnixMicrosFunction() { // [START timestamp_unix_micros] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("dateString").timestampToUnixMicros().as("unixMicros") - ]) - .execute(); + ) + ); // [END timestamp_unix_micros] console.log(result); } async function timestampToUnixMillisFunction() { // [START timestamp_unix_millis] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("dateString").timestampToUnixMillis().as("unixMillis") - ]) - .execute(); + ) + ); // [END timestamp_unix_millis] console.log(result); } async function timestampToUnixSecondsFunction() { // [START timestamp_unix_seconds] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("dateString").timestampToUnixSeconds().as("unixSeconds") - ]) - .execute(); + ) + ); // [END timestamp_unix_seconds] console.log(result); } @@ -2557,12 +2566,12 @@ describe("firestore-pipelines", () => { async function cosineDistanceFunction() { // [START cosine_distance] const sampleVector = [0.0, 1, 2, 3, 4, 5]; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").cosineDistance(sampleVector).as("cosineDistance") - ]) - .execute(); + ) + ); // [END cosine_distance] console.log(result); } @@ -2570,12 +2579,12 @@ describe("firestore-pipelines", () => { async function dotProductFunction() { // [START dot_product] const sampleVector = [0.0, 1, 2, 3, 4, 5]; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").dotProduct(sampleVector).as("dotProduct") - ]) - .execute(); + ) + ); // [END dot_product] console.log(result); } @@ -2583,24 +2592,24 @@ describe("firestore-pipelines", () => { async function euclideanDistanceFunction() { // [START euclidean_distance] const sampleVector = [0.0, 1, 2, 3, 4, 5]; - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").euclideanDistance(sampleVector).as("euclideanDistance") - ]) - .execute(); + ) + ); // [END euclidean_distance] console.log(result); } async function vectorLengthFunction() { // [START vector_length] - const result = await db.pipeline() + const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").vectorLength().as("vectorLength") - ]) - .execute(); + ) + ); // [END vector_length] console.log(result); } From f5729cb7d92f27ea0bce759bdabba7a6b587c7da Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Wed, 5 Nov 2025 17:08:42 -0800 Subject: [PATCH 09/19] run snippets --- .../test-firestore/add_function.js | 6 +++--- .../test-firestore/aggregate_distinct.js | 8 ++++---- .../test-firestore/aggregate_groups.js | 13 +++++-------- .../test-firestore/and_function.js | 8 ++++---- .../test-firestore/array_concat.js | 6 +++--- .../test-firestore/array_contains.js | 6 +++--- .../test-firestore/array_contains_all.js | 8 ++++---- .../test-firestore/array_contains_any.js | 8 ++++---- .../test-firestore/array_length.js | 6 +++--- .../test-firestore/array_reverse.js | 6 +++--- .../test-firestore/avg_function.js | 6 +++--- .../firestore-next/test-firestore/basic_read.js | 17 ++++++++--------- .../test-firestore/byte_length.js | 8 ++++---- .../test-firestore/ceil_function.js | 8 ++++---- .../test-firestore/char_length.js | 8 ++++---- .../test-firestore/collection_example.js | 6 +++--- .../test-firestore/collection_group_example.js | 6 +++--- .../test-firestore/cond_function.js | 8 ++++---- .../test-firestore/cosine_distance.js | 8 ++++---- .../test-firestore/count_distinct.js | 4 ++-- .../test-firestore/count_function.js | 12 ++++++------ .../firestore-next/test-firestore/count_if.js | 4 ++-- .../test-firestore/covered_query.js | 6 +++--- .../test-firestore/database_example.js | 6 +++--- .../test-firestore/divide_function.js | 6 +++--- .../test-firestore/documents_example.js | 5 +++-- .../test-firestore/dot_product.js | 8 ++++---- .../firestore-next/test-firestore/eq_any.js | 8 ++++---- .../test-firestore/equal_function.js | 6 +++--- .../test-firestore/euclidean_distance.js | 8 ++++---- .../test-firestore/exists_function.js | 6 +++--- .../test-firestore/exp_function.js | 6 +++--- .../test-firestore/floor_function.js | 8 ++++---- .../test-firestore/full_replace.js | 6 +++--- .../test-firestore/functions_example.js | 14 +++++++------- .../test-firestore/greater_or_equal.js | 6 +++--- .../test-firestore/greater_than.js | 6 +++--- .../test-firestore/initial_data.js | 8 ++++---- .../test-firestore/input_stages.js | 10 +++++----- .../test-firestore/less_or_equal.js | 6 +++--- .../firestore-next/test-firestore/less_than.js | 6 +++--- snippets/firestore-next/test-firestore/like.js | 8 ++++---- .../test-firestore/ln_function.js | 6 +++--- .../firestore-next/test-firestore/map_get.js | 8 ++++---- .../test-firestore/max_function.js | 6 +++--- .../test-firestore/max_logical_function.js | 8 ++++---- .../test-firestore/min_function.js | 6 +++--- .../test-firestore/min_logical_function.js | 8 ++++---- .../test-firestore/mod_function.js | 6 +++--- .../test-firestore/multiply_function.js | 6 +++--- .../firestore-next/test-firestore/not_eq_any.js | 8 ++++---- .../firestore-next/test-firestore/not_equal.js | 6 +++--- .../test-firestore/not_function.js | 8 ++++---- .../test-firestore/or_function.js | 8 ++++---- .../pagination_not_supported_preview.js | 5 +++-- .../test-firestore/pipeline_concepts.js | 2 +- .../test-firestore/pipeline_initialization.js | 1 + .../test-firestore/pipeline_where.js | 8 ++++---- .../test-firestore/pow_function.js | 12 ++++++------ .../test-firestore/query_example.js | 6 +++--- .../test-firestore/regex_contains.js | 8 ++++---- .../test-firestore/regex_match.js | 8 ++++---- .../test-firestore/round_function.js | 8 ++++---- .../test-firestore/sample_example.js | 8 ++++---- .../test-firestore/sample_percent.js | 4 ++-- snippets/firestore-next/test-firestore/sort.js | 8 ++++---- .../test-firestore/sort_comparison.js | 10 +++++----- .../test-firestore/sparse_index_example.js | 4 ++-- .../test-firestore/sqrt_function.js | 12 ++++++------ .../test-firestore/starts_with.js | 8 ++++---- .../firestore-next/test-firestore/str_concat.js | 8 ++++---- .../test-firestore/str_reverse.js | 8 ++++---- .../test-firestore/string_contains.js | 8 ++++---- .../test-firestore/substr_function.js | 8 ++++---- .../test-firestore/subtract_function.js | 6 +++--- .../test-firestore/sum_function.js | 6 +++--- .../test-firestore/timestamp_add.js | 8 ++++---- .../test-firestore/timestamp_sub.js | 8 ++++---- .../test-firestore/timestamp_unix_micros.js | 8 ++++---- .../test-firestore/timestamp_unix_millis.js | 8 ++++---- .../test-firestore/timestamp_unix_seconds.js | 8 ++++---- .../firestore-next/test-firestore/to_lower.js | 8 ++++---- .../firestore-next/test-firestore/to_upper.js | 8 ++++---- .../test-firestore/trim_function.js | 8 ++++---- .../test-firestore/union_stage.js | 6 +++--- .../test-firestore/union_stage_stable.js | 8 ++++---- .../test-firestore/unix_micros_timestamp.js | 8 ++++---- .../test-firestore/unix_millis_timestamp.js | 8 ++++---- .../test-firestore/unix_seconds_timestamp.js | 8 ++++---- .../test-firestore/unnest_edge_cases.js | 6 +++--- .../test-firestore/unnest_stage.js | 6 +++--- .../test-firestore/vector_length.js | 8 ++++---- .../test-firestore/xor_function.js | 8 ++++---- 93 files changed, 341 insertions(+), 342 deletions(-) diff --git a/snippets/firestore-next/test-firestore/add_function.js b/snippets/firestore-next/test-firestore/add_function.js index f93097db..3483c5f3 100644 --- a/snippets/firestore-next/test-firestore/add_function.js +++ b/snippets/firestore-next/test-firestore/add_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START add_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("soldBooks").add(field("unsoldBooks")).as("totalBooks")]) - .execute(); + .select(field("soldBooks").add(field("unsoldBooks")).as("totalBooks")) +); // [END add_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/aggregate_distinct.js b/snippets/firestore-next/test-firestore/aggregate_distinct.js index 1956413a..27f893a0 100644 --- a/snippets/firestore-next/test-firestore/aggregate_distinct.js +++ b/snippets/firestore-next/test-firestore/aggregate_distinct.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START aggregate_distinct_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("books") - .distinct([ + .distinct( field("author").toUpper().as("author"), field("genre") - ]) - .execute(); + ) +); // [END aggregate_distinct_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/aggregate_groups.js b/snippets/firestore-next/test-firestore/aggregate_groups.js index 213ef522..6cc5f8bb 100644 --- a/snippets/firestore-next/test-firestore/aggregate_groups.js +++ b/snippets/firestore-next/test-firestore/aggregate_groups.js @@ -5,14 +5,11 @@ // 'npm run snippets'. // [START aggregate_groups_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("books") - .aggregate([ + .aggregate( field("rating").average().as("avg_rating") - ], { - groups: [ - field("genre") - ] - }) - .execute(); + ) + .distinct(field("genre")) +); // [END aggregate_groups_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/and_function.js b/snippets/firestore-next/test-firestore/and_function.js index 1f413e22..27e40a44 100644 --- a/snippets/firestore-next/test-firestore/and_function.js +++ b/snippets/firestore-next/test-firestore/and_function.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START and_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( and(field("rating").greaterThan(4), (field("price").lessThan(10))) .as("under10Recommendation") - ]) - .execute(); + ) +); // [END and_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_concat.js b/snippets/firestore-next/test-firestore/array_concat.js index 1b9bd090..05941622 100644 --- a/snippets/firestore-next/test-firestore/array_concat.js +++ b/snippets/firestore-next/test-firestore/array_concat.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START array_concat_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayConcat([field("subGenre")]).as("allGenres")]) - .execute(); + .select(field("genre").arrayConcat([field("subGenre")]).as("allGenres")) +); // [END array_concat_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_contains.js b/snippets/firestore-next/test-firestore/array_contains.js index a4b7a231..5289aabc 100644 --- a/snippets/firestore-next/test-firestore/array_contains.js +++ b/snippets/firestore-next/test-firestore/array_contains.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START array_contains_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayContains(constant("mystery")).as("isMystery")]) - .execute(); + .select(field("genre").arrayContains(constant("mystery")).as("isMystery")) +); // [END array_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_contains_all.js b/snippets/firestore-next/test-firestore/array_contains_all.js index dda980cb..63e425a7 100644 --- a/snippets/firestore-next/test-firestore/array_contains_all.js +++ b/snippets/firestore-next/test-firestore/array_contains_all.js @@ -5,12 +5,12 @@ // 'npm run snippets'. // [START array_contains_all_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre") .arrayContainsAll([constant("fantasy"), constant("adventure")]) .as("isFantasyAdventure") - ]) - .execute(); + ) +); // [END array_contains_all_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_contains_any.js b/snippets/firestore-next/test-firestore/array_contains_any.js index 0abad050..88d61b08 100644 --- a/snippets/firestore-next/test-firestore/array_contains_any.js +++ b/snippets/firestore-next/test-firestore/array_contains_any.js @@ -5,12 +5,12 @@ // 'npm run snippets'. // [START array_contains_any_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre") .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) .as("isMysteryOrFantasy") - ]) - .execute(); + ) +); // [END array_contains_any_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_length.js b/snippets/firestore-next/test-firestore/array_length.js index 3cbcf150..89d32f6e 100644 --- a/snippets/firestore-next/test-firestore/array_length.js +++ b/snippets/firestore-next/test-firestore/array_length.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START array_length_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayLength().as("genreCount")]) - .execute(); + .select(field("genre").arrayLength().as("genreCount")) +); // [END array_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/array_reverse.js b/snippets/firestore-next/test-firestore/array_reverse.js index 1f808342..6f4be979 100644 --- a/snippets/firestore-next/test-firestore/array_reverse.js +++ b/snippets/firestore-next/test-firestore/array_reverse.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START array_reverse_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("genre").arrayReverse().as("reversedGenres")]) - .execute(); + .select(field("genre").arrayReverse().as("reversedGenres")) +); // [END array_reverse_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/avg_function.js b/snippets/firestore-next/test-firestore/avg_function.js index 0ec3cf71..bc9c9116 100644 --- a/snippets/firestore-next/test-firestore/avg_function.js +++ b/snippets/firestore-next/test-firestore/avg_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START avg_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("cities") - .aggregate([field("population").average().as("averagePopulation")]) - .execute(); + .aggregate(field("population").average().as("averagePopulation")) +); // [END avg_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/basic_read.js b/snippets/firestore-next/test-firestore/basic_read.js index 10adb205..2789901c 100644 --- a/snippets/firestore-next/test-firestore/basic_read.js +++ b/snippets/firestore-next/test-firestore/basic_read.js @@ -6,16 +6,15 @@ // [START basic_read_modular] const readDataPipeline = db.pipeline() - .collection("users") + .collection("users"); // Execute the pipeline and handle the result -readDataPipeline.execute() - .then((querySnapshot) => { - querySnapshot.forEach((result) => { - console.log(`${result.id} => ${result.data()}`); - }); - }) - .catch((error) => { - console.error("Error getting documents: ", error); +try { + const querySnapshot = await execute(readDataPipeline); + querySnapshot.results.forEach((result) => { + console.log(`${result.id} => ${result.data()}`); }); +} catch (error) { + console.error("Error getting documents: ", error); +} // [END basic_read_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/byte_length.js b/snippets/firestore-next/test-firestore/byte_length.js index ea6e63dc..12356ff6 100644 --- a/snippets/firestore-next/test-firestore/byte_length.js +++ b/snippets/firestore-next/test-firestore/byte_length.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START byte_length_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").byteLength().as("titleByteLength") - ]) - .execute(); + ) +); // [END byte_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/ceil_function.js b/snippets/firestore-next/test-firestore/ceil_function.js index 234209c7..569a2a25 100644 --- a/snippets/firestore-next/test-firestore/ceil_function.js +++ b/snippets/firestore-next/test-firestore/ceil_function.js @@ -6,10 +6,10 @@ // [START ceil_function_modular] const booksPerShelf = 100; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("unsoldBooks").divide(constant(booksPerShelf)).ceil().as("requiredShelves") - ]) - .execute(); + ) +); // [END ceil_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/char_length.js b/snippets/firestore-next/test-firestore/char_length.js index 3090dfed..2cf65650 100644 --- a/snippets/firestore-next/test-firestore/char_length.js +++ b/snippets/firestore-next/test-firestore/char_length.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START char_length_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").charLength().as("titleCharLength") - ]) - .execute(); + ) +); // [END char_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/collection_example.js b/snippets/firestore-next/test-firestore/collection_example.js index 7c841dc9..f969634e 100644 --- a/snippets/firestore-next/test-firestore/collection_example.js +++ b/snippets/firestore-next/test-firestore/collection_example.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START collection_example_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("users/bob/games") - .sort([field("name").ascending()]) - .execute(); + .sort(field("name").ascending()) + ); // [END collection_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/collection_group_example.js b/snippets/firestore-next/test-firestore/collection_group_example.js index 835d76bb..d567ba48 100644 --- a/snippets/firestore-next/test-firestore/collection_group_example.js +++ b/snippets/firestore-next/test-firestore/collection_group_example.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START collection_group_example_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collectionGroup("games") - .sort([field("name").ascending()]) - .execute(); + .sort(field("name").ascending()) + ); // [END collection_group_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/cond_function.js b/snippets/firestore-next/test-firestore/cond_function.js index bf8b50b4..245b94fd 100644 --- a/snippets/firestore-next/test-firestore/cond_function.js +++ b/snippets/firestore-next/test-firestore/cond_function.js @@ -5,13 +5,13 @@ // 'npm run snippets'. // [START cond_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("tags").arrayConcat([ field("pages").greaterThan(100) .conditional(constant("longRead"), constant("shortRead")) ]).as("extendedTags") - ]) - .execute(); + ) +); // [END cond_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/cosine_distance.js b/snippets/firestore-next/test-firestore/cosine_distance.js index da91ec15..e69fb641 100644 --- a/snippets/firestore-next/test-firestore/cosine_distance.js +++ b/snippets/firestore-next/test-firestore/cosine_distance.js @@ -6,10 +6,10 @@ // [START cosine_distance_modular] const sampleVector = [0.0, 1, 2, 3, 4, 5]; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").cosineDistance(sampleVector).as("cosineDistance") - ]) - .execute(); + ) +); // [END cosine_distance_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/count_distinct.js b/snippets/firestore-next/test-firestore/count_distinct.js index c814473e..8feeb38b 100644 --- a/snippets/firestore-next/test-firestore/count_distinct.js +++ b/snippets/firestore-next/test-firestore/count_distinct.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START count_distinct_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") .aggregate(field("author").countDistinct().as("unique_authors")) - .execute(); +); // [END count_distinct_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/count_function.js b/snippets/firestore-next/test-firestore/count_function.js index 245835fa..3a9b8d09 100644 --- a/snippets/firestore-next/test-firestore/count_function.js +++ b/snippets/firestore-next/test-firestore/count_function.js @@ -6,14 +6,14 @@ // [START count_function_modular] // Total number of books in the collection -const countOfAll = await db.pipeline() +const countOfAll = await execute(db.pipeline() .collection("books") - .aggregate([countAll().as("count")]) - .execute(); + .aggregate(countAll().as("count")) +); // Number of books with nonnull `ratings` field -const countField = await db.pipeline() +const countField = await execute(db.pipeline() .collection("books") - .aggregate([field("ratings").count().as("count")]) - .execute(); + .aggregate(field("ratings").count().as("count")) +); // [END count_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/count_if.js b/snippets/firestore-next/test-firestore/count_if.js index a6636da6..6303b8ec 100644 --- a/snippets/firestore-next/test-firestore/count_if.js +++ b/snippets/firestore-next/test-firestore/count_if.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START count_if_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") .aggregate( field("rating").greaterThan(4).countIf().as("filteredCount") ) - .execute(); +); // [END count_if_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/covered_query.js b/snippets/firestore-next/test-firestore/covered_query.js index 85c739bd..9f92d282 100644 --- a/snippets/firestore-next/test-firestore/covered_query.js +++ b/snippets/firestore-next/test-firestore/covered_query.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START covered_query_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("books") .where(field("category").like("%fantasy%")) .where(field("title").exists()) .where(field("author").exists()) - .select([field("title"), field("author")]) - .execute(); + .select(field("title"), field("author")) +); // [END covered_query_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/database_example.js b/snippets/firestore-next/test-firestore/database_example.js index a48a61a7..14426381 100644 --- a/snippets/firestore-next/test-firestore/database_example.js +++ b/snippets/firestore-next/test-firestore/database_example.js @@ -6,8 +6,8 @@ // [START database_example_modular] // Count all documents in the database -const results = await db.pipeline() +const results = await execute(db.pipeline() .database() - .aggregate([countAll().as("total")]) - .execute(); + .aggregate(countAll().as("total")) + ); // [END database_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/divide_function.js b/snippets/firestore-next/test-firestore/divide_function.js index 6d090274..a4668a58 100644 --- a/snippets/firestore-next/test-firestore/divide_function.js +++ b/snippets/firestore-next/test-firestore/divide_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START divide_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("ratings").divide(field("soldBooks")).as("reviewRate")]) - .execute(); + .select(field("ratings").divide(field("soldBooks")).as("reviewRate")) +); // [END divide_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/documents_example.js b/snippets/firestore-next/test-firestore/documents_example.js index 6236d385..83a272a2 100644 --- a/snippets/firestore-next/test-firestore/documents_example.js +++ b/snippets/firestore-next/test-firestore/documents_example.js @@ -5,10 +5,11 @@ // 'npm run snippets'. // [START documents_example_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .documents([ doc(db, "cities", "SF"), doc(db, "cities", "DC"), doc(db, "cities", "NY") - ]).execute(); + ]) +); // [END documents_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/dot_product.js b/snippets/firestore-next/test-firestore/dot_product.js index b5fce945..bf694e79 100644 --- a/snippets/firestore-next/test-firestore/dot_product.js +++ b/snippets/firestore-next/test-firestore/dot_product.js @@ -6,10 +6,10 @@ // [START dot_product_modular] const sampleVector = [0.0, 1, 2, 3, 4, 5]; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").dotProduct(sampleVector).as("dotProduct") - ]) - .execute(); + ) +); // [END dot_product_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/eq_any.js b/snippets/firestore-next/test-firestore/eq_any.js index e1e517f3..d22004fb 100644 --- a/snippets/firestore-next/test-firestore/eq_any.js +++ b/snippets/firestore-next/test-firestore/eq_any.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START eq_any_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre").equalAny(["Science Fiction", "Psychological Thriller"]) .as("matchesGenreFilters") - ]) - .execute(); + ) +); // [END eq_any_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/equal_function.js b/snippets/firestore-next/test-firestore/equal_function.js index 746a3bab..94881396 100644 --- a/snippets/firestore-next/test-firestore/equal_function.js +++ b/snippets/firestore-next/test-firestore/equal_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START equal_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("rating").equal(5).as("hasPerfectRating")]) - .execute(); + .select(field("rating").equal(5).as("hasPerfectRating")) +); // [END equal_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/euclidean_distance.js b/snippets/firestore-next/test-firestore/euclidean_distance.js index 195ed37a..a1c51f1c 100644 --- a/snippets/firestore-next/test-firestore/euclidean_distance.js +++ b/snippets/firestore-next/test-firestore/euclidean_distance.js @@ -6,10 +6,10 @@ // [START euclidean_distance_modular] const sampleVector = [0.0, 1, 2, 3, 4, 5]; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").euclideanDistance(sampleVector).as("euclideanDistance") - ]) - .execute(); + ) +); // [END euclidean_distance_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/exists_function.js b/snippets/firestore-next/test-firestore/exists_function.js index f7c1cdaf..b903fc68 100644 --- a/snippets/firestore-next/test-firestore/exists_function.js +++ b/snippets/firestore-next/test-firestore/exists_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START exists_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("rating").exists().as("hasRating")]) - .execute(); + .select(field("rating").exists().as("hasRating")) +); // [END exists_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/exp_function.js b/snippets/firestore-next/test-firestore/exp_function.js index a0443622..670e5440 100644 --- a/snippets/firestore-next/test-firestore/exp_function.js +++ b/snippets/firestore-next/test-firestore/exp_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START exp_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("rating").exp().as("expRating")]) - .execute(); + .select(field("rating").exp().as("expRating")) +); // [END exp_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/floor_function.js b/snippets/firestore-next/test-firestore/floor_function.js index a77b9001..f5602ea3 100644 --- a/snippets/firestore-next/test-firestore/floor_function.js +++ b/snippets/firestore-next/test-firestore/floor_function.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START floor_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .addFields([ + .addFields( field("wordCount").divide(field("pages")).floor().as("wordsPerPage") - ]) - .execute(); + ) +); // [END floor_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/full_replace.js b/snippets/firestore-next/test-firestore/full_replace.js index 2cd7a744..3befe953 100644 --- a/snippets/firestore-next/test-firestore/full_replace.js +++ b/snippets/firestore-next/test-firestore/full_replace.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START full_replace_modular] -const names = await db.pipeline() +const names = await execute(db.pipeline() .collection("cities") - .replace(field("location")) - .execute(); + .replaceWith(field("location")) +); // [END full_replace_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/functions_example.js b/snippets/firestore-next/test-firestore/functions_example.js index e3bf5310..cdc86768 100644 --- a/snippets/firestore-next/test-firestore/functions_example.js +++ b/snippets/firestore-next/test-firestore/functions_example.js @@ -9,15 +9,15 @@ let results; // Type 1: Scalar (for use in non-aggregation stages) // Example: Return the min store price for each book. -results = await db.pipeline().collection("books") - .select([ +results = await execute(db.pipeline().collection("books") + .select( field("current").logicalMinimum(["updated"]).as("price_min") - ]) - .execute(); + ) +); // Type 2: Aggregation (for use in aggregate stages) // Example: Return the min price of all books. -results = await db.pipeline().collection("books") - .aggregate([field("price").minimum().as("min_price")]) - .execute(); +results = await execute(db.pipeline().collection("books") + .aggregate(field("price").minimum().as("min_price")) +); // [END functions_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/greater_or_equal.js b/snippets/firestore-next/test-firestore/greater_or_equal.js index 0d9cedb0..b4d7534a 100644 --- a/snippets/firestore-next/test-firestore/greater_or_equal.js +++ b/snippets/firestore-next/test-firestore/greater_or_equal.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START greater_or_equal_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")]) - .execute(); + .select(field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")) +); // [END greater_or_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/greater_than.js b/snippets/firestore-next/test-firestore/greater_than.js index 3b12ff25..41d1aa0c 100644 --- a/snippets/firestore-next/test-firestore/greater_than.js +++ b/snippets/firestore-next/test-firestore/greater_than.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START greater_than_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("rating").greaterThan(4).as("hasHighRating")]) - .execute(); + .select(field("rating").greaterThan(4).as("hasHighRating")) +); // [END greater_than_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/initial_data.js b/snippets/firestore-next/test-firestore/initial_data.js index 40dadc45..f47803c5 100644 --- a/snippets/firestore-next/test-firestore/initial_data.js +++ b/snippets/firestore-next/test-firestore/initial_data.js @@ -5,7 +5,7 @@ // 'npm run snippets'. // [START initial_data_modular] -await db.collection("cities").doc("SF").set({ +await setDoc(doc(collection(db, "cities"), "SF"), { "name": "San Francisco", "population": 800000, "location": { @@ -13,7 +13,7 @@ await db.collection("cities").doc("SF").set({ "state": "California" } }); -await db.collection("cities").doc("TO").set({ +await setDoc(doc(collection(db, "cities"), "TO"), { "name": "Toronto", "population": 3000000, "province": "ON", @@ -22,14 +22,14 @@ await db.collection("cities").doc("TO").set({ "province": "Ontario" } }); -await db.collection("cities").doc("NY").set({ +await setDoc(doc(collection(db, "cities"), "NY"), { "name": "New York", "location": { "country": "USA", "state": "New York" } }); -await db.collection("cities").doc("AT").set({ +await setDoc(doc(collection(db, "cities"), "AT"), { "name": "Atlantis", }); // [END initial_data_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/input_stages.js b/snippets/firestore-next/test-firestore/input_stages.js index eaa08aad..4b596653 100644 --- a/snippets/firestore-next/test-firestore/input_stages.js +++ b/snippets/firestore-next/test-firestore/input_stages.js @@ -8,18 +8,18 @@ let results; // Return all restaurants in San Francisco -results = await db.pipeline().collection("cities/sf/restaurants").execute(); +results = await execute(db.pipeline().collection("cities/sf/restaurants")); // Return all restaurants -results = await db.pipeline().collectionGroup("restaurants").execute(); +results = await execute(db.pipeline().collectionGroup("restaurants")); // Return all documents across all collections in the database (the entire database) -results = await db.pipeline().database().execute(); +results = await execute(db.pipeline().database()); // Batch read of 3 documents -results = await db.pipeline().documents([ +results = await execute(db.pipeline().documents([ doc(db, "cities", "SF"), doc(db, "cities", "DC"), doc(db, "cities", "NY") -]).execute(); +])); // [END input_stages_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/less_or_equal.js b/snippets/firestore-next/test-firestore/less_or_equal.js index b75c4a41..8bb30179 100644 --- a/snippets/firestore-next/test-firestore/less_or_equal.js +++ b/snippets/firestore-next/test-firestore/less_or_equal.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START less_or_equal_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("rating").lessThanOrEqual(2).as("hasBadRating")]) - .execute(); + .select(field("rating").lessThanOrEqual(2).as("hasBadRating")) +); // [END less_or_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/less_than.js b/snippets/firestore-next/test-firestore/less_than.js index c87f5cbb..9d104ba6 100644 --- a/snippets/firestore-next/test-firestore/less_than.js +++ b/snippets/firestore-next/test-firestore/less_than.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START less_than_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("published").lessThan(1923).as("isPublicDomainProbably")]) - .execute(); + .select(field("published").lessThan(1923).as("isPublicDomainProbably")) +); // [END less_than_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/like.js b/snippets/firestore-next/test-firestore/like.js index e94caa9a..d7bf9516 100644 --- a/snippets/firestore-next/test-firestore/like.js +++ b/snippets/firestore-next/test-firestore/like.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START like_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("genre").like("%Fiction") .as("anyFiction") - ]) - .execute(); + ) +); // [END like_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/ln_function.js b/snippets/firestore-next/test-firestore/ln_function.js index 5f284f07..049e0bdd 100644 --- a/snippets/firestore-next/test-firestore/ln_function.js +++ b/snippets/firestore-next/test-firestore/ln_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START ln_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("rating").ln().as("lnRating")]) - .execute(); + .select(field("rating").ln().as("lnRating")) +); // [END ln_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/map_get.js b/snippets/firestore-next/test-firestore/map_get.js index 30d6645b..098c1d5b 100644 --- a/snippets/firestore-next/test-firestore/map_get.js +++ b/snippets/firestore-next/test-firestore/map_get.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START map_get_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("awards").mapGet("pulitzer").as("hasPulitzerAward") - ]) - .execute(); + ) +); // [END map_get_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/max_function.js b/snippets/firestore-next/test-firestore/max_function.js index 96af6ee6..9ab828e6 100644 --- a/snippets/firestore-next/test-firestore/max_function.js +++ b/snippets/firestore-next/test-firestore/max_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START max_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .aggregate([field("price").maximum().as("maximumPrice")]) - .execute(); + .aggregate(field("price").maximum().as("maximumPrice")) +); // [END max_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/max_logical_function.js b/snippets/firestore-next/test-firestore/max_logical_function.js index 6a985180..196e0ebd 100644 --- a/snippets/firestore-next/test-firestore/max_logical_function.js +++ b/snippets/firestore-next/test-firestore/max_logical_function.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START max_logical_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("rating").logicalMaximum([1]).as("flooredRating") - ]) - .execute(); + ) +); // [END max_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/min_function.js b/snippets/firestore-next/test-firestore/min_function.js index bb57e140..9f22c16c 100644 --- a/snippets/firestore-next/test-firestore/min_function.js +++ b/snippets/firestore-next/test-firestore/min_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START min_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .aggregate([field("price").minimum().as("minimumPrice")]) - .execute(); + .aggregate(field("price").minimum().as("minimumPrice")) +); // [END min_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/min_logical_function.js b/snippets/firestore-next/test-firestore/min_logical_function.js index d0cfaa56..aa2ea820 100644 --- a/snippets/firestore-next/test-firestore/min_logical_function.js +++ b/snippets/firestore-next/test-firestore/min_logical_function.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START min_logical_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("rating").logicalMinimum([5]).as("cappedRating") - ]) - .execute(); + ) +); // [END min_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/mod_function.js b/snippets/firestore-next/test-firestore/mod_function.js index 67e07d05..16bb7f8b 100644 --- a/snippets/firestore-next/test-firestore/mod_function.js +++ b/snippets/firestore-next/test-firestore/mod_function.js @@ -6,8 +6,8 @@ // [START mod_function_modular] const displayCapacity = 1000; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")]) - .execute(); + .select(field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")) +); // [END mod_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/multiply_function.js b/snippets/firestore-next/test-firestore/multiply_function.js index ec712764..d89430ff 100644 --- a/snippets/firestore-next/test-firestore/multiply_function.js +++ b/snippets/firestore-next/test-firestore/multiply_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START multiply_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("price").multiply(field("soldBooks")).as("revenue")]) - .execute(); + .select(field("price").multiply(field("soldBooks")).as("revenue")) +); // [END multiply_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/not_eq_any.js b/snippets/firestore-next/test-firestore/not_eq_any.js index 89568cad..5b0c4149 100644 --- a/snippets/firestore-next/test-firestore/not_eq_any.js +++ b/snippets/firestore-next/test-firestore/not_eq_any.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START not_eq_any_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("author").notEqualAny(["George Orwell", "F. Scott Fitzgerald"]) .as("byExcludedAuthors") - ]) - .execute(); + ) +); // [END not_eq_any_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/not_equal.js b/snippets/firestore-next/test-firestore/not_equal.js index 49c8e915..c8acc8d3 100644 --- a/snippets/firestore-next/test-firestore/not_equal.js +++ b/snippets/firestore-next/test-firestore/not_equal.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START not_equal_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("title").notEqual("1984").as("not1984")]) - .execute(); + .select(field("title").notEqual("1984").as("not1984")) +); // [END not_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/not_function.js b/snippets/firestore-next/test-firestore/not_function.js index f9301f4f..9324b74e 100644 --- a/snippets/firestore-next/test-firestore/not_function.js +++ b/snippets/firestore-next/test-firestore/not_function.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START not_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( (field("tags").arrayContains("nonfiction").not()) .as("isFiction") - ]) - .execute(); + ) +); // [END not_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/or_function.js b/snippets/firestore-next/test-firestore/or_function.js index c4c93480..4199bdce 100644 --- a/snippets/firestore-next/test-firestore/or_function.js +++ b/snippets/firestore-next/test-firestore/or_function.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START or_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( or(field("genre").equal("Fantasy"), (field("tags").arrayContains("adventure"))) .as("matchesSearchFilters") - ]) - .execute(); + ) +); // [END or_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js b/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js index ef9f3211..4a78a54d 100644 --- a/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js +++ b/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js @@ -6,11 +6,12 @@ // [START pagination_not_supported_preview_modular] // Existing pagination via `startAt()` -const query = db.collection("cities").orderBy("population").startAt(1000000); +const q = // db.collection("cities").orderBy("population").startAt(1000000); + query(collection(db, "cities"), orderBy("population"), startAt(1000000)); // Private preview workaround using pipelines const pipeline = db.pipeline() .collection("cities") .where(field("population").greaterThanOrEqual(1000000)) - .sort([field("population").descending()]); + .sort(field("population").descending()); // [END pagination_not_supported_preview_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pipeline_concepts.js b/snippets/firestore-next/test-firestore/pipeline_concepts.js index 64712f9d..e93b2d9f 100644 --- a/snippets/firestore-next/test-firestore/pipeline_concepts.js +++ b/snippets/firestore-next/test-firestore/pipeline_concepts.js @@ -11,7 +11,7 @@ const pipeline = db.pipeline() // Step 2: Filter the collection .where(field("population").greaterThan(100000)) // Step 3: Sort the remaining documents - .sort([field("name").ascending()]) + .sort(field("name").ascending()) // Step 4: Return the top 10. Note applying the limit earlier in the // pipeline would have unintentional results. .limit(10); diff --git a/snippets/firestore-next/test-firestore/pipeline_initialization.js b/snippets/firestore-next/test-firestore/pipeline_initialization.js index 5832a720..c7943d21 100644 --- a/snippets/firestore-next/test-firestore/pipeline_initialization.js +++ b/snippets/firestore-next/test-firestore/pipeline_initialization.js @@ -6,6 +6,7 @@ // [START pipeline_initialization_modular] import { getFirestore } from "@firebase/firestore"; +import { execute } from "@firebase/firestore/pipelines"; const database = getFirestore(app, "enterprise"); const pipeline = database.pipeline(); // [END pipeline_initialization_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pipeline_where.js b/snippets/firestore-next/test-firestore/pipeline_where.js index 31d7a64e..e4ca5182 100644 --- a/snippets/firestore-next/test-firestore/pipeline_where.js +++ b/snippets/firestore-next/test-firestore/pipeline_where.js @@ -7,12 +7,12 @@ // [START pipeline_where_modular] let results; -results = await db.pipeline().collection("books") +results = await execute(db.pipeline().collection("books") .where(field("rating").equal(5)) .where(field("published").lessThan(1900)) - .execute(); +); -results = await db.pipeline().collection("books") +results = await execute(db.pipeline().collection("books") .where(and(field("rating").equal(5), (field("published").lessThan(1900)))) - .execute(); +); // [END pipeline_where_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pow_function.js b/snippets/firestore-next/test-firestore/pow_function.js index 3365c46d..1e45eea2 100644 --- a/snippets/firestore-next/test-firestore/pow_function.js +++ b/snippets/firestore-next/test-firestore/pow_function.js @@ -6,9 +6,9 @@ // [START pow_function_modular] const googleplex = { latitude: 37.4221, longitude: 122.0853 }; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("cities") - .addFields([ + .addFields( field("lat").subtract(constant(googleplex.latitude)) .multiply(111 /* km per degree */) .pow(2) @@ -17,11 +17,11 @@ const result = await db.pipeline() .multiply(111 /* km per degree */) .pow(2) .as("longitudeDifference") - ]) - .select([ + ) + .select( field("latitudeDifference").add(field("longitudeDifference")).sqrt() // Inaccurate for large distances or close to poles .as("approximateDistanceToGoogle") - ]) - .execute(); + ) +); // [END pow_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/query_example.js b/snippets/firestore-next/test-firestore/query_example.js index dce401d6..0a47a09e 100644 --- a/snippets/firestore-next/test-firestore/query_example.js +++ b/snippets/firestore-next/test-firestore/query_example.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START query_example_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("books") .where(field("published").lessThan(1900)) .where(field("genre").equal("Science Fiction")) .where(field("rating").greaterThan(4.3)) - .sort([field("published").descending()]) - .execute(); + .sort(field("published").descending()) +); // [END query_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/regex_contains.js b/snippets/firestore-next/test-firestore/regex_contains.js index 2dfdf6fd..22edc7e9 100644 --- a/snippets/firestore-next/test-firestore/regex_contains.js +++ b/snippets/firestore-next/test-firestore/regex_contains.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START regex_contains_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("title").regexContains("Firestore (Enterprise|Standard)") .as("isFirestoreRelated") - ]) - .execute(); + ) +); // [END regex_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/regex_match.js b/snippets/firestore-next/test-firestore/regex_match.js index 64061e57..84d1d77b 100644 --- a/snippets/firestore-next/test-firestore/regex_match.js +++ b/snippets/firestore-next/test-firestore/regex_match.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START regex_match_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("title").regexMatch("Firestore (Enterprise|Standard)") .as("isFirestoreExactly") - ]) - .execute(); + ) +); // [END regex_match_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/round_function.js b/snippets/firestore-next/test-firestore/round_function.js index 1e4928f8..94d85b63 100644 --- a/snippets/firestore-next/test-firestore/round_function.js +++ b/snippets/firestore-next/test-firestore/round_function.js @@ -5,9 +5,9 @@ // 'npm run snippets'. // [START round_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("soldBooks").multiply(field("price")).round().as("partialRevenue")]) - .aggregate([field("partialRevenue").sum().as("totalRevenue")]) - .execute(); + .select(field("soldBooks").multiply(field("price")).round().as("partialRevenue")) + .aggregate(field("partialRevenue").sum().as("totalRevenue")) + ); // [END round_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sample_example.js b/snippets/firestore-next/test-firestore/sample_example.js index 6f89dce3..47873e55 100644 --- a/snippets/firestore-next/test-firestore/sample_example.js +++ b/snippets/firestore-next/test-firestore/sample_example.js @@ -8,18 +8,18 @@ let results; // Get a sample of 100 documents in a database -results = await db.pipeline() +results = await execute(db.pipeline() .database() .sample(100) - .execute(); +); // Randomly shuffle a list of 3 documents -results = await db.pipeline() +results = await execute(db.pipeline() .documents([ doc(db, "cities", "SF"), doc(db, "cities", "NY"), doc(db, "cities", "DC"), ]) .sample(3) - .execute(); +); // [END sample_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sample_percent.js b/snippets/firestore-next/test-firestore/sample_percent.js index fae40af4..1c105a5f 100644 --- a/snippets/firestore-next/test-firestore/sample_percent.js +++ b/snippets/firestore-next/test-firestore/sample_percent.js @@ -6,8 +6,8 @@ // [START sample_percent_modular] // Get a sample of on average 50% of the documents in the database -const results = await db.pipeline() +const results = await execute(db.pipeline() .database() .sample({ percentage: 0.5 }) - .execute(); +); // [END sample_percent_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sort.js b/snippets/firestore-next/test-firestore/sort.js index ec551584..87326619 100644 --- a/snippets/firestore-next/test-firestore/sort.js +++ b/snippets/firestore-next/test-firestore/sort.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START sort_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("books") - .sort([ + .sort( field("release_date").descending(), field("author").ascending() - ]) - .execute(); + ) +); // [END sort_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sort_comparison.js b/snippets/firestore-next/test-firestore/sort_comparison.js index d4e2ad49..9d0ff01e 100644 --- a/snippets/firestore-next/test-firestore/sort_comparison.js +++ b/snippets/firestore-next/test-firestore/sort_comparison.js @@ -5,13 +5,13 @@ // 'npm run snippets'. // [START sort_comparison_modular] -const query = db.collection("cities") - .orderBy("state") - .orderBy("population", "desc"); +const q = query(collection(db, "cities"), + orderBy("state"), + orderBy("population", "desc")); const pipeline = db.pipeline() .collection("books") - .sort([ + .sort( field("release_date").descending(), field("author").ascending() - ]); + ); // [END sort_comparison_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sparse_index_example.js b/snippets/firestore-next/test-firestore/sparse_index_example.js index 9318e95b..420cf8e1 100644 --- a/snippets/firestore-next/test-firestore/sparse_index_example.js +++ b/snippets/firestore-next/test-firestore/sparse_index_example.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START sparse_index_example_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("books") .where(field("category").like("%fantasy%")) - .execute(); +); // [END sparse_index_example_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sqrt_function.js b/snippets/firestore-next/test-firestore/sqrt_function.js index 3e78d065..15af33e5 100644 --- a/snippets/firestore-next/test-firestore/sqrt_function.js +++ b/snippets/firestore-next/test-firestore/sqrt_function.js @@ -6,9 +6,9 @@ // [START sqrt_function_modular] const googleplex = { latitude: 37.4221, longitude: 122.0853 }; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("cities") - .addFields([ + .addFields( field("lat").subtract(constant(googleplex.latitude)) .multiply(111 /* km per degree */) .pow(2) @@ -17,11 +17,11 @@ const result = await db.pipeline() .multiply(111 /* km per degree */) .pow(2) .as("longitudeDifference") - ]) - .select([ + ) + .select( field("latitudeDifference").add(field("longitudeDifference")).sqrt() // Inaccurate for large distances or close to poles .as("approximateDistanceToGoogle") - ]) - .execute(); + ) +); // [END sqrt_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/starts_with.js b/snippets/firestore-next/test-firestore/starts_with.js index ca8db963..04236279 100644 --- a/snippets/firestore-next/test-firestore/starts_with.js +++ b/snippets/firestore-next/test-firestore/starts_with.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START starts_with_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").startsWith("The") .as("needsSpecialAlphabeticalSort") - ]) - .execute(); + ) +); // [END starts_with_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/str_concat.js b/snippets/firestore-next/test-firestore/str_concat.js index 303b3788..f1d219da 100644 --- a/snippets/firestore-next/test-firestore/str_concat.js +++ b/snippets/firestore-next/test-firestore/str_concat.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START str_concat_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("title").stringConcat(" by ", field("author")) .as("fullyQualifiedTitle") - ]) - .execute(); + ) +); // [END str_concat_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/str_reverse.js b/snippets/firestore-next/test-firestore/str_reverse.js index 95d8123e..752a8f86 100644 --- a/snippets/firestore-next/test-firestore/str_reverse.js +++ b/snippets/firestore-next/test-firestore/str_reverse.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START str_reverse_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("name").reverse().as("reversedName") - ]) - .execute(); + ) +); // [END str_reverse_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/string_contains.js b/snippets/firestore-next/test-firestore/string_contains.js index 7fff5f30..d8140aaa 100644 --- a/snippets/firestore-next/test-firestore/string_contains.js +++ b/snippets/firestore-next/test-firestore/string_contains.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START string_contains_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("articles") - .select([ + .select( field("body").stringContains("Firestore") .as("isFirestoreRelated") - ]) - .execute(); + ) +); // [END string_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/substr_function.js b/snippets/firestore-next/test-firestore/substr_function.js index 2e34484c..0b1733e2 100644 --- a/snippets/firestore-next/test-firestore/substr_function.js +++ b/snippets/firestore-next/test-firestore/substr_function.js @@ -5,12 +5,12 @@ // 'npm run snippets'. // [START substr_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") .where(field("title").startsWith("The ")) - .select([ + .select( field("title").substring(4) .as("titleWithoutLeadingThe") - ]) - .execute(); + ) +); // [END substr_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/subtract_function.js b/snippets/firestore-next/test-firestore/subtract_function.js index 27cc2ab0..53a73a66 100644 --- a/snippets/firestore-next/test-firestore/subtract_function.js +++ b/snippets/firestore-next/test-firestore/subtract_function.js @@ -6,8 +6,8 @@ // [START subtract_function_modular] const storeCredit = 7; -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([field("price").subtract(constant(storeCredit)).as("totalCost")]) - .execute(); + .select(field("price").subtract(constant(storeCredit)).as("totalCost")) +); // [END subtract_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/sum_function.js b/snippets/firestore-next/test-firestore/sum_function.js index d57c5895..a77a5003 100644 --- a/snippets/firestore-next/test-firestore/sum_function.js +++ b/snippets/firestore-next/test-firestore/sum_function.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START sum_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("cities") - .aggregate([field("population").sum().as("totalPopulation")]) - .execute(); + .aggregate(field("population").sum().as("totalPopulation")) +); // [END sum_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_add.js b/snippets/firestore-next/test-firestore/timestamp_add.js index f96789bd..4dbef032 100644 --- a/snippets/firestore-next/test-firestore/timestamp_add.js +++ b/snippets/firestore-next/test-firestore/timestamp_add.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START timestamp_add_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAt").timestampAdd("day", 3653).as("expiresAt") - ]) - .execute(); + ) +); // [END timestamp_add_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_sub.js b/snippets/firestore-next/test-firestore/timestamp_sub.js index 8fd40458..459e0263 100644 --- a/snippets/firestore-next/test-firestore/timestamp_sub.js +++ b/snippets/firestore-next/test-firestore/timestamp_sub.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START timestamp_sub_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("expiresAt").timestampSubtract("day", 14).as("sendWarningTimestamp") - ]) - .execute(); + ) +); // [END timestamp_sub_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_unix_micros.js b/snippets/firestore-next/test-firestore/timestamp_unix_micros.js index 4519c232..48862d27 100644 --- a/snippets/firestore-next/test-firestore/timestamp_unix_micros.js +++ b/snippets/firestore-next/test-firestore/timestamp_unix_micros.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START timestamp_unix_micros_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("dateString").timestampToUnixMicros().as("unixMicros") - ]) - .execute(); + ) +); // [END timestamp_unix_micros_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_unix_millis.js b/snippets/firestore-next/test-firestore/timestamp_unix_millis.js index f4a7a6c4..ca8dbcf2 100644 --- a/snippets/firestore-next/test-firestore/timestamp_unix_millis.js +++ b/snippets/firestore-next/test-firestore/timestamp_unix_millis.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START timestamp_unix_millis_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("dateString").timestampToUnixMillis().as("unixMillis") - ]) - .execute(); + ) +); // [END timestamp_unix_millis_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/timestamp_unix_seconds.js b/snippets/firestore-next/test-firestore/timestamp_unix_seconds.js index bf70eea7..dfcc7423 100644 --- a/snippets/firestore-next/test-firestore/timestamp_unix_seconds.js +++ b/snippets/firestore-next/test-firestore/timestamp_unix_seconds.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START timestamp_unix_seconds_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("dateString").timestampToUnixSeconds().as("unixSeconds") - ]) - .execute(); + ) +); // [END timestamp_unix_seconds_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/to_lower.js b/snippets/firestore-next/test-firestore/to_lower.js index 7d41a264..64f001e1 100644 --- a/snippets/firestore-next/test-firestore/to_lower.js +++ b/snippets/firestore-next/test-firestore/to_lower.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START to_lower_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("authors") - .select([ + .select( field("genre").toLower().equal("fantasy") .as("isFantasy") - ]) - .execute(); + ) +); // [END to_lower_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/to_upper.js b/snippets/firestore-next/test-firestore/to_upper.js index 5290792f..468f00d1 100644 --- a/snippets/firestore-next/test-firestore/to_upper.js +++ b/snippets/firestore-next/test-firestore/to_upper.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START to_upper_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("authors") - .select([ + .select( field("name").toUpper() .as("uppercaseName") - ]) - .execute(); + ) +); // [END to_upper_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/trim_function.js b/snippets/firestore-next/test-firestore/trim_function.js index 24d8fb19..64153138 100644 --- a/snippets/firestore-next/test-firestore/trim_function.js +++ b/snippets/firestore-next/test-firestore/trim_function.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START trim_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("name").trim().as("whitespaceTrimmedName") - ]) - .execute(); + ) +); // [END trim_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/union_stage.js b/snippets/firestore-next/test-firestore/union_stage.js index 8d87329f..db549a70 100644 --- a/snippets/firestore-next/test-firestore/union_stage.js +++ b/snippets/firestore-next/test-firestore/union_stage.js @@ -5,13 +5,13 @@ // 'npm run snippets'. // [START union_stage_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("cities/SF/restaurants") .where(field("type").equal("Chinese")) .union(db.pipeline() .collection("cities/NY/restaurants") .where(field("type").equal("Italian"))) .where(field("rating").greaterThanOrEqual(4.5)) - .sort([field("__name__").descending()]) - .execute(); + .sort(field("__name__").descending()) +); // [END union_stage_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/union_stage_stable.js b/snippets/firestore-next/test-firestore/union_stage_stable.js index 9eebd035..48072a9c 100644 --- a/snippets/firestore-next/test-firestore/union_stage_stable.js +++ b/snippets/firestore-next/test-firestore/union_stage_stable.js @@ -5,13 +5,13 @@ // 'npm run snippets'. // [START union_stage_stable_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .collection("cities/SF/restaurants") .where(field("type").equal("Chinese")) .union(db.pipeline() .collection("cities/NY/restaurants") - .where(field("type").equal("Italian")), { stable: true }) + .where(field("type").equal("Italian")) /*, { stable: true } */) .where(field("rating").greaterThanOrEqual(4.5)) - .sort([field("__name__").descending()]) - .execute(); + .sort(field("__name__").descending()) +); // [END union_stage_stable_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unix_micros_timestamp.js b/snippets/firestore-next/test-firestore/unix_micros_timestamp.js index da881fb8..4fd69202 100644 --- a/snippets/firestore-next/test-firestore/unix_micros_timestamp.js +++ b/snippets/firestore-next/test-firestore/unix_micros_timestamp.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START unix_micros_timestamp_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAtMicros").unixMicrosToTimestamp().as("createdAtString") - ]) - .execute(); + ) +); // [END unix_micros_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unix_millis_timestamp.js b/snippets/firestore-next/test-firestore/unix_millis_timestamp.js index bfb1b196..87f547fa 100644 --- a/snippets/firestore-next/test-firestore/unix_millis_timestamp.js +++ b/snippets/firestore-next/test-firestore/unix_millis_timestamp.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START unix_millis_timestamp_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAtMillis").unixMillisToTimestamp().as("createdAtString") - ]) - .execute(); + ) +); // [END unix_millis_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unix_seconds_timestamp.js b/snippets/firestore-next/test-firestore/unix_seconds_timestamp.js index 4ebf8fad..84b25c30 100644 --- a/snippets/firestore-next/test-firestore/unix_seconds_timestamp.js +++ b/snippets/firestore-next/test-firestore/unix_seconds_timestamp.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START unix_seconds_timestamp_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("documents") - .select([ + .select( field("createdAtSeconds").unixSecondsToTimestamp().as("createdAtString") - ]) - .execute(); + ) +); // [END unix_seconds_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/unnest_edge_cases.js b/snippets/firestore-next/test-firestore/unnest_edge_cases.js index 2d666555..72d6bbce 100644 --- a/snippets/firestore-next/test-firestore/unnest_edge_cases.js +++ b/snippets/firestore-next/test-firestore/unnest_edge_cases.js @@ -9,10 +9,10 @@ // { identifier : 1, neighbors: [ "Alice", "Cathy" ] } // { identifier : 2, neighbors: [] } // { identifier : 3, neighbors: "Bob" } -const results = await db.pipeline() +const results = await execute(db.pipeline() .database() - .unnest(field("neighbors").as("unnestedNeighbors"), { indexField: "index" }) - .execute(); + .unnest(field("neighbors").as("unnestedNeighbors"), "index" ) +); // Output // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Alice", index: 0 } diff --git a/snippets/firestore-next/test-firestore/unnest_stage.js b/snippets/firestore-next/test-firestore/unnest_stage.js index e8cfedb1..ded031b6 100644 --- a/snippets/firestore-next/test-firestore/unnest_stage.js +++ b/snippets/firestore-next/test-firestore/unnest_stage.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START unnest_stage_modular] -const results = await db.pipeline() +const results = await execute(db.pipeline() .database() - .unnest(field("arrayField").as("unnestedArrayField"), { indexField: "index" }) - .execute(); + .unnest(field("arrayField").as("unnestedArrayField"), "index") +); // [END unnest_stage_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/vector_length.js b/snippets/firestore-next/test-firestore/vector_length.js index 10f085cf..5eb0bf0e 100644 --- a/snippets/firestore-next/test-firestore/vector_length.js +++ b/snippets/firestore-next/test-firestore/vector_length.js @@ -5,10 +5,10 @@ // 'npm run snippets'. // [START vector_length_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( field("embedding").vectorLength().as("vectorLength") - ]) - .execute(); + ) +); // [END vector_length_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/xor_function.js b/snippets/firestore-next/test-firestore/xor_function.js index 26c9363c..d8812705 100644 --- a/snippets/firestore-next/test-firestore/xor_function.js +++ b/snippets/firestore-next/test-firestore/xor_function.js @@ -5,11 +5,11 @@ // 'npm run snippets'. // [START xor_function_modular] -const result = await db.pipeline() +const result = await execute(db.pipeline() .collection("books") - .select([ + .select( xor(field("tags").arrayContains("magic"), (field("tags").arrayContains("nonfiction"))) .as("matchesSearchFilters") - ]) - .execute(); + ) +); // [END xor_function_modular] \ No newline at end of file From 0c5a0a9ef12785153e558aa68618f932fcb831f2 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Thu, 6 Nov 2025 08:32:36 -0800 Subject: [PATCH 10/19] fix dependency --- firestore-next/package.json | 3 +-- firestore-next/test.firestore.js | 8 ++++---- .../test-firestore/pipeline_initialization.js | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/firestore-next/package.json b/firestore-next/package.json index 6480960d..f87855b5 100644 --- a/firestore-next/package.json +++ b/firestore-next/package.json @@ -6,8 +6,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@firebase/firestore": "eap-firestore-pipelines", - "firebase": "^12.4.0", + "firebase": "eap-firestore-pipelines", "geofire-common": "^6.0.0" }, "devDependencies": { diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 398a882b..7d9181ed 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1334,7 +1334,7 @@ describe("firestore-pipelines", () => { query, setDoc, startAt - } = require("@firebase/firestore") + } = require("firebase/firestore") const { Pipeline, field, @@ -1346,7 +1346,7 @@ describe("firestore-pipelines", () => { xor, conditional, execute - } = require("@firebase/firestore/pipelines"); + } = require("firebase/firestore/pipelines"); let app; /** @type {Firestore} */ let db; @@ -1397,8 +1397,8 @@ describe("firestore-pipelines", () => { function pipelineInitialization() { // [START pipeline_initialization] - const { getFirestore } = require("@firebase/firestore"); - const { execute } = require("@firebase/firestore/pipelines"); + const { getFirestore } = require("firebase/firestore"); + const { execute } = require("firebase/firestore/pipelines"); const database = getFirestore(app, "enterprise"); const pipeline = database.pipeline(); // [END pipeline_initialization] diff --git a/snippets/firestore-next/test-firestore/pipeline_initialization.js b/snippets/firestore-next/test-firestore/pipeline_initialization.js index c7943d21..d9b20bdf 100644 --- a/snippets/firestore-next/test-firestore/pipeline_initialization.js +++ b/snippets/firestore-next/test-firestore/pipeline_initialization.js @@ -5,8 +5,8 @@ // 'npm run snippets'. // [START pipeline_initialization_modular] -import { getFirestore } from "@firebase/firestore"; -import { execute } from "@firebase/firestore/pipelines"; +import { getFirestore } from "firebase/firestore"; +import { execute } from "firebase/firestore/pipelines"; const database = getFirestore(app, "enterprise"); const pipeline = database.pipeline(); // [END pipeline_initialization_modular] \ No newline at end of file From baf4f82d0a9446bdcbfd687946fa1b81a50d5acb Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Thu, 6 Nov 2025 09:42:11 -0800 Subject: [PATCH 11/19] fix whitespace --- firestore-next/test.firestore.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 7d9181ed..7cf146c0 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1326,14 +1326,14 @@ describe("firestore", () => { describe("firestore-pipelines", () => { const { - Firestore, - collection, - doc, - getFirestore, - orderBy, - query, - setDoc, - startAt + Firestore, + collection, + doc, + getFirestore, + orderBy, + query, + setDoc, + startAt } = require("firebase/firestore") const { Pipeline, From 9879c76fc7d9837896ab1d9d5c2a88cedc4cb349 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Thu, 6 Nov 2025 11:47:54 -0800 Subject: [PATCH 12/19] remove stable snippet --- firestore-next/test.firestore.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 7cf146c0..10984284 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1727,21 +1727,6 @@ describe("firestore-pipelines", () => { console.log(results); } - async function unionStageStable() { - // [START union_stage_stable] - const results = await execute(db.pipeline() - .collection("cities/SF/restaurants") - .where(field("type").equal("Chinese")) - .union(db.pipeline() - .collection("cities/NY/restaurants") - .where(field("type").equal("Italian")) /*, { stable: true } */) - .where(field("rating").greaterThanOrEqual(4.5)) - .sort(field("__name__").descending()) - ); - // [END union_stage_stable] - console.log(results); - } - async function unnestStage() { // [START unnest_stage] const results = await execute(db.pipeline() From b8556d325a24f15433644c5a2d92fe6c04478268 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Thu, 6 Nov 2025 11:48:25 -0800 Subject: [PATCH 13/19] run snippets --- .../test-firestore/union_stage_stable.js | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 snippets/firestore-next/test-firestore/union_stage_stable.js diff --git a/snippets/firestore-next/test-firestore/union_stage_stable.js b/snippets/firestore-next/test-firestore/union_stage_stable.js deleted file mode 100644 index 48072a9c..00000000 --- a/snippets/firestore-next/test-firestore/union_stage_stable.js +++ /dev/null @@ -1,17 +0,0 @@ -// This snippet file was generated by processing the source file: -// ./firestore-next/test.firestore.js -// -// To update the snippets in this file, edit the source and then run -// 'npm run snippets'. - -// [START union_stage_stable_modular] -const results = await execute(db.pipeline() - .collection("cities/SF/restaurants") - .where(field("type").equal("Chinese")) - .union(db.pipeline() - .collection("cities/NY/restaurants") - .where(field("type").equal("Italian")) /*, { stable: true } */) - .where(field("rating").greaterThanOrEqual(4.5)) - .sort(field("__name__").descending()) -); -// [END union_stage_stable_modular] \ No newline at end of file From 2e84dccae3f8b85ceec0506ee6b81f2c24cf3cb5 Mon Sep 17 00:00:00 2001 From: markarndt <50713862+markarndt@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:56:12 -0800 Subject: [PATCH 14/19] Update test.firestore.js Add missing START/END for ends_with --- firestore-next/test.firestore.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 10984284..31f7a906 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -2306,6 +2306,7 @@ describe("firestore-pipelines", () => { } async function endsWithFunction() { + // [START ends_with] const result = await execute(db.pipeline() .collection("inventory/devices/laptops") .select( @@ -2313,6 +2314,7 @@ describe("firestore-pipelines", () => { .as("16InLaptops") ) ); + // [END ends_with] console.log(result); } @@ -2598,4 +2600,4 @@ describe("firestore-pipelines", () => { // [END vector_length] console.log(result); } -}); \ No newline at end of file +}); From ac81c69f0fe15c34ff3252e9dc0f889c2f6f1268 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Thu, 6 Nov 2025 15:01:21 -0800 Subject: [PATCH 15/19] run snippets --- .../firestore-next/test-firestore/ends_with.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 snippets/firestore-next/test-firestore/ends_with.js diff --git a/snippets/firestore-next/test-firestore/ends_with.js b/snippets/firestore-next/test-firestore/ends_with.js new file mode 100644 index 00000000..98b95e7f --- /dev/null +++ b/snippets/firestore-next/test-firestore/ends_with.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START ends_with_modular] +const result = await execute(db.pipeline() + .collection("inventory/devices/laptops") + .select( + field("name").endsWith("16 inch") + .as("16InLaptops") + ) +); +// [END ends_with_modular] \ No newline at end of file From 8e0139f75294a5887fcf7ae7b95b376b5228051a Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Thu, 6 Nov 2025 17:55:05 -0800 Subject: [PATCH 16/19] remove extra brackets and parens, add better pagination --- firestore-next/test.firestore.js | 48 ++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 31f7a906..60ce1eb0 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1447,7 +1447,7 @@ describe("firestore-pipelines", () => { ); results = await execute(db.pipeline().collection("books") - .where(and(field("rating").equal(5), (field("published").lessThan(1900)))) + .where(and(field("rating").equal(5), field("published").lessThan(1900))) ); // [END pipeline_where] console.log(results); @@ -1514,9 +1514,7 @@ describe("firestore-pipelines", () => { // Type 1: Scalar (for use in non-aggregation stages) // Example: Return the min store price for each book. results = await execute(db.pipeline().collection("books") - .select( - field("current").logicalMinimum(["updated"]).as("price_min") - ) + .select(field("current").logicalMinimum(field("updated")).as("price_min")) ); // Type 2: Aggregation (for use in aggregate stages) @@ -1574,17 +1572,39 @@ describe("firestore-pipelines", () => { console.log(results); } - function pagination() { + async function pagination() { // [START pagination_not_supported_preview] // Existing pagination via `startAt()` - const q = // db.collection("cities").orderBy("population").startAt(1000000); + const q = query(collection(db, "cities"), orderBy("population"), startAt(1000000)); // Private preview workaround using pipelines + const pageSize = 2; const pipeline = db.pipeline() .collection("cities") - .where(field("population").greaterThanOrEqual(1000000)) - .sort(field("population").descending()); + .select("name", "population", "__name__") + .sort(field("population").descending(), field("__name__").ascending()); + + // Page 1 results + let snapshot = await execute(pipeline.limit(pageSize)); + + // End of page marker + const lastDoc = snapshot.results[snapshot.results.length - 1]; + + // Page 2 results + snapshot = await execute( + pipeline + .where( + or( + and( + field("population").equal(lastDoc.get("population")), + field("__name__").greaterThan(lastDoc.ref) + ), + field("population").lessThan(lastDoc.get("population")) + ) + ) + .limit(pageSize) + ); // [END pagination_not_supported_preview] console.log(q); console.log(pipeline); @@ -2144,7 +2164,7 @@ describe("firestore-pipelines", () => { const result = await execute(db.pipeline() .collection("books") .select( - and(field("rating").greaterThan(4), (field("price").lessThan(10))) + and(field("rating").greaterThan(4), field("price").lessThan(10)) .as("under10Recommendation") ) ); @@ -2157,7 +2177,7 @@ describe("firestore-pipelines", () => { const result = await execute(db.pipeline() .collection("books") .select( - or(field("genre").equal("Fantasy"), (field("tags").arrayContains("adventure"))) + or(field("genre").equal("Fantasy"), field("tags").arrayContains("adventure")) .as("matchesSearchFilters") ) ); @@ -2170,7 +2190,7 @@ describe("firestore-pipelines", () => { const result = await execute(db.pipeline() .collection("books") .select( - xor(field("tags").arrayContains("magic"), (field("tags").arrayContains("nonfiction"))) + xor(field("tags").arrayContains("magic"), field("tags").arrayContains("nonfiction")) .as("matchesSearchFilters") ) ); @@ -2183,7 +2203,7 @@ describe("firestore-pipelines", () => { const result = await execute(db.pipeline() .collection("books") .select( - (field("tags").arrayContains("nonfiction").not()) + field("tags").arrayContains("nonfiction").not() .as("isFiction") ) ); @@ -2237,7 +2257,7 @@ describe("firestore-pipelines", () => { const result = await execute(db.pipeline() .collection("books") .select( - field("rating").logicalMaximum([1]).as("flooredRating") + field("rating").logicalMaximum(1).as("flooredRating") ) ); // [END max_logical_function] @@ -2249,7 +2269,7 @@ describe("firestore-pipelines", () => { const result = await execute(db.pipeline() .collection("books") .select( - field("rating").logicalMinimum([5]).as("cappedRating") + field("rating").logicalMinimum(5).as("cappedRating") ) ); // [END min_logical_function] From d4efe6a48cbc33f4eebcf17f0a049452f524c995 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Fri, 7 Nov 2025 13:57:28 -0800 Subject: [PATCH 17/19] Add snippets for nodejs here temporarily (#405) * add admin snippets temporarily * write node snippets * run snippets --- firestore-temp/package.json | 17 + firestore-temp/test.firestore.js | 1296 +++++++++++++++++ .../test-firestore/and_function.js | 2 +- .../test-firestore/functions_example.js | 4 +- .../test-firestore/max_logical_function.js | 2 +- .../test-firestore/min_logical_function.js | 2 +- .../test-firestore/not_function.js | 2 +- .../test-firestore/or_function.js | 2 +- .../pagination_not_supported_preview.js | 28 +- .../test-firestore/pipeline_where.js | 2 +- .../test-firestore/xor_function.js | 2 +- .../test-firestore/add_function.js | 12 + .../test-firestore/aggregate_distinct.js | 15 + .../test-firestore/aggregate_groups.js | 15 + .../test-firestore/and_function.js | 15 + .../test-firestore/array_concat.js | 12 + .../test-firestore/array_contains.js | 12 + .../test-firestore/array_contains_all.js | 16 + .../test-firestore/array_contains_any.js | 16 + .../test-firestore/array_length.js | 12 + .../test-firestore/array_reverse.js | 12 + .../test-firestore/avg_function.js | 12 + .../test-firestore/basic_read.js | 20 + .../test-firestore/byte_length.js | 14 + .../test-firestore/ceil_function.js | 15 + .../test-firestore/char_length.js | 14 + .../test-firestore/collection_example.js | 12 + .../collection_group_example.js | 12 + .../test-firestore/cond_function.js | 20 + .../test-firestore/cosine_distance.js | 15 + .../test-firestore/count_distinct.js | 12 + .../test-firestore/count_function.js | 19 + .../firestore-temp/test-firestore/count_if.js | 14 + .../test-firestore/covered_query.js | 15 + .../test-firestore/database_example.js | 13 + .../test-firestore/divide_function.js | 12 + .../test-firestore/documents_example.js | 15 + .../test-firestore/dot_product.js | 15 + .../test-firestore/ends_with.js | 15 + .../firestore-temp/test-firestore/eq_any.js | 15 + .../test-firestore/equal_function.js | 12 + .../test-firestore/euclidean_distance.js | 15 + .../test-firestore/exists_function.js | 12 + .../test-firestore/exp_function.js | 12 + .../test-firestore/field_or_constant.js | 11 + .../test-firestore/floor_function.js | 14 + .../test-firestore/full_replace.js | 12 + .../test-firestore/functions_example.js | 21 + .../test-firestore/greater_or_equal.js | 12 + .../test-firestore/greater_than.js | 12 + .../test-firestore/initial_data.js | 35 + .../test-firestore/input_stages.js | 25 + .../test-firestore/less_or_equal.js | 12 + .../test-firestore/less_than.js | 12 + .../firestore-temp/test-firestore/like.js | 15 + .../test-firestore/ln_function.js | 12 + .../test-firestore/log_function.js | 9 + .../firestore-temp/test-firestore/map_get.js | 14 + .../test-firestore/map_merge_overwrite.js | 9 + .../test-firestore/max_function.js | 12 + .../test-firestore/max_logical_function.js | 14 + .../test-firestore/min_function.js | 12 + .../test-firestore/min_logical_function.js | 14 + .../test-firestore/mod_function.js | 13 + .../test-firestore/multiply_function.js | 12 + .../test-firestore/not_eq_any.js | 15 + .../test-firestore/not_equal.js | 12 + .../test-firestore/not_function.js | 15 + .../test-firestore/or_function.js | 15 + .../pagination_not_supported_preview.js | 38 + .../test-firestore/pipeline_concepts.js | 18 + .../test-firestore/pipeline_initialization.js | 14 + .../test-firestore/pipeline_where.js | 18 + .../test-firestore/pow_function.js | 27 + .../test-firestore/query_example.js | 15 + .../test-firestore/regex_contains.js | 15 + .../test-firestore/regex_match.js | 15 + .../test-firestore/round_function.js | 13 + .../test-firestore/sample_example.js | 25 + .../test-firestore/sample_percent.js | 13 + .../firestore-temp/test-firestore/sort.js | 14 + .../test-firestore/sort_comparison.js | 17 + .../test-firestore/sparse_index_example.js | 12 + .../test-firestore/sqrt_function.js | 27 + .../test-firestore/starts_with.js | 15 + .../test-firestore/str_concat.js | 15 + .../test-firestore/str_reverse.js | 14 + .../test-firestore/string_contains.js | 15 + .../test-firestore/substr_function.js | 16 + .../test-firestore/subtract_function.js | 13 + .../test-firestore/sum_function.js | 12 + .../test-firestore/timestamp_add.js | 14 + .../test-firestore/timestamp_sub.js | 14 + .../test-firestore/timestamp_unix_micros.js | 14 + .../test-firestore/timestamp_unix_millis.js | 14 + .../test-firestore/timestamp_unix_seconds.js | 14 + .../firestore-temp/test-firestore/to_lower.js | 15 + .../firestore-temp/test-firestore/to_upper.js | 15 + .../test-firestore/trim_function.js | 14 + .../test-firestore/union_stage.js | 17 + .../test-firestore/unix_micros_timestamp.js | 14 + .../test-firestore/unix_millis_timestamp.js | 14 + .../test-firestore/unix_seconds_timestamp.js | 14 + .../test-firestore/unnest_edge_cases.js | 21 + .../test-firestore/unnest_stage.js | 12 + .../test-firestore/vector_length.js | 14 + .../test-firestore/xor_function.js | 15 + 107 files changed, 2788 insertions(+), 13 deletions(-) create mode 100644 firestore-temp/package.json create mode 100644 firestore-temp/test.firestore.js create mode 100644 snippets/firestore-temp/test-firestore/add_function.js create mode 100644 snippets/firestore-temp/test-firestore/aggregate_distinct.js create mode 100644 snippets/firestore-temp/test-firestore/aggregate_groups.js create mode 100644 snippets/firestore-temp/test-firestore/and_function.js create mode 100644 snippets/firestore-temp/test-firestore/array_concat.js create mode 100644 snippets/firestore-temp/test-firestore/array_contains.js create mode 100644 snippets/firestore-temp/test-firestore/array_contains_all.js create mode 100644 snippets/firestore-temp/test-firestore/array_contains_any.js create mode 100644 snippets/firestore-temp/test-firestore/array_length.js create mode 100644 snippets/firestore-temp/test-firestore/array_reverse.js create mode 100644 snippets/firestore-temp/test-firestore/avg_function.js create mode 100644 snippets/firestore-temp/test-firestore/basic_read.js create mode 100644 snippets/firestore-temp/test-firestore/byte_length.js create mode 100644 snippets/firestore-temp/test-firestore/ceil_function.js create mode 100644 snippets/firestore-temp/test-firestore/char_length.js create mode 100644 snippets/firestore-temp/test-firestore/collection_example.js create mode 100644 snippets/firestore-temp/test-firestore/collection_group_example.js create mode 100644 snippets/firestore-temp/test-firestore/cond_function.js create mode 100644 snippets/firestore-temp/test-firestore/cosine_distance.js create mode 100644 snippets/firestore-temp/test-firestore/count_distinct.js create mode 100644 snippets/firestore-temp/test-firestore/count_function.js create mode 100644 snippets/firestore-temp/test-firestore/count_if.js create mode 100644 snippets/firestore-temp/test-firestore/covered_query.js create mode 100644 snippets/firestore-temp/test-firestore/database_example.js create mode 100644 snippets/firestore-temp/test-firestore/divide_function.js create mode 100644 snippets/firestore-temp/test-firestore/documents_example.js create mode 100644 snippets/firestore-temp/test-firestore/dot_product.js create mode 100644 snippets/firestore-temp/test-firestore/ends_with.js create mode 100644 snippets/firestore-temp/test-firestore/eq_any.js create mode 100644 snippets/firestore-temp/test-firestore/equal_function.js create mode 100644 snippets/firestore-temp/test-firestore/euclidean_distance.js create mode 100644 snippets/firestore-temp/test-firestore/exists_function.js create mode 100644 snippets/firestore-temp/test-firestore/exp_function.js create mode 100644 snippets/firestore-temp/test-firestore/field_or_constant.js create mode 100644 snippets/firestore-temp/test-firestore/floor_function.js create mode 100644 snippets/firestore-temp/test-firestore/full_replace.js create mode 100644 snippets/firestore-temp/test-firestore/functions_example.js create mode 100644 snippets/firestore-temp/test-firestore/greater_or_equal.js create mode 100644 snippets/firestore-temp/test-firestore/greater_than.js create mode 100644 snippets/firestore-temp/test-firestore/initial_data.js create mode 100644 snippets/firestore-temp/test-firestore/input_stages.js create mode 100644 snippets/firestore-temp/test-firestore/less_or_equal.js create mode 100644 snippets/firestore-temp/test-firestore/less_than.js create mode 100644 snippets/firestore-temp/test-firestore/like.js create mode 100644 snippets/firestore-temp/test-firestore/ln_function.js create mode 100644 snippets/firestore-temp/test-firestore/log_function.js create mode 100644 snippets/firestore-temp/test-firestore/map_get.js create mode 100644 snippets/firestore-temp/test-firestore/map_merge_overwrite.js create mode 100644 snippets/firestore-temp/test-firestore/max_function.js create mode 100644 snippets/firestore-temp/test-firestore/max_logical_function.js create mode 100644 snippets/firestore-temp/test-firestore/min_function.js create mode 100644 snippets/firestore-temp/test-firestore/min_logical_function.js create mode 100644 snippets/firestore-temp/test-firestore/mod_function.js create mode 100644 snippets/firestore-temp/test-firestore/multiply_function.js create mode 100644 snippets/firestore-temp/test-firestore/not_eq_any.js create mode 100644 snippets/firestore-temp/test-firestore/not_equal.js create mode 100644 snippets/firestore-temp/test-firestore/not_function.js create mode 100644 snippets/firestore-temp/test-firestore/or_function.js create mode 100644 snippets/firestore-temp/test-firestore/pagination_not_supported_preview.js create mode 100644 snippets/firestore-temp/test-firestore/pipeline_concepts.js create mode 100644 snippets/firestore-temp/test-firestore/pipeline_initialization.js create mode 100644 snippets/firestore-temp/test-firestore/pipeline_where.js create mode 100644 snippets/firestore-temp/test-firestore/pow_function.js create mode 100644 snippets/firestore-temp/test-firestore/query_example.js create mode 100644 snippets/firestore-temp/test-firestore/regex_contains.js create mode 100644 snippets/firestore-temp/test-firestore/regex_match.js create mode 100644 snippets/firestore-temp/test-firestore/round_function.js create mode 100644 snippets/firestore-temp/test-firestore/sample_example.js create mode 100644 snippets/firestore-temp/test-firestore/sample_percent.js create mode 100644 snippets/firestore-temp/test-firestore/sort.js create mode 100644 snippets/firestore-temp/test-firestore/sort_comparison.js create mode 100644 snippets/firestore-temp/test-firestore/sparse_index_example.js create mode 100644 snippets/firestore-temp/test-firestore/sqrt_function.js create mode 100644 snippets/firestore-temp/test-firestore/starts_with.js create mode 100644 snippets/firestore-temp/test-firestore/str_concat.js create mode 100644 snippets/firestore-temp/test-firestore/str_reverse.js create mode 100644 snippets/firestore-temp/test-firestore/string_contains.js create mode 100644 snippets/firestore-temp/test-firestore/substr_function.js create mode 100644 snippets/firestore-temp/test-firestore/subtract_function.js create mode 100644 snippets/firestore-temp/test-firestore/sum_function.js create mode 100644 snippets/firestore-temp/test-firestore/timestamp_add.js create mode 100644 snippets/firestore-temp/test-firestore/timestamp_sub.js create mode 100644 snippets/firestore-temp/test-firestore/timestamp_unix_micros.js create mode 100644 snippets/firestore-temp/test-firestore/timestamp_unix_millis.js create mode 100644 snippets/firestore-temp/test-firestore/timestamp_unix_seconds.js create mode 100644 snippets/firestore-temp/test-firestore/to_lower.js create mode 100644 snippets/firestore-temp/test-firestore/to_upper.js create mode 100644 snippets/firestore-temp/test-firestore/trim_function.js create mode 100644 snippets/firestore-temp/test-firestore/union_stage.js create mode 100644 snippets/firestore-temp/test-firestore/unix_micros_timestamp.js create mode 100644 snippets/firestore-temp/test-firestore/unix_millis_timestamp.js create mode 100644 snippets/firestore-temp/test-firestore/unix_seconds_timestamp.js create mode 100644 snippets/firestore-temp/test-firestore/unnest_edge_cases.js create mode 100644 snippets/firestore-temp/test-firestore/unnest_stage.js create mode 100644 snippets/firestore-temp/test-firestore/vector_length.js create mode 100644 snippets/firestore-temp/test-firestore/xor_function.js diff --git a/firestore-temp/package.json b/firestore-temp/package.json new file mode 100644 index 00000000..33968c49 --- /dev/null +++ b/firestore-temp/package.json @@ -0,0 +1,17 @@ +{ + "name": "firestore-temp", + "version": "1.0.0", + "scripts": { + "compile": "cp ../tsconfig.json.template ./tsconfig.json && tsc" + }, + "license": "Apache-2.0", + "devDependencies": { + "@types/chai": "^5.2.3", + "@types/mocha": "^10.0.10", + "chai": "^6.2.0", + "mocha": "^11.7.4" + }, + "dependencies": { + "@google-cloud/firestore": "^8.0.0-pipelines.1" + } +} diff --git a/firestore-temp/test.firestore.js b/firestore-temp/test.firestore.js new file mode 100644 index 00000000..bd27da8f --- /dev/null +++ b/firestore-temp/test.firestore.js @@ -0,0 +1,1296 @@ +// [SNIPPET_REGISTRY disabled] +// [SNIPPETS_SEPARATION enabled] + +const { expect } = require('chai'); + +describe("firestore-pipelines", () => { + const { + Firestore + } = require("@google-cloud/firestore") + const { + Pipeline, + arrayReverse, + field, + constant, + countAll, + AggregateFunction, + and, + like, + or, + xor, + conditional + } = require("@google-cloud/firestore/pipelines"); + + let app; + /** @type {Firestore} */ let db; + + before(() => { + db = new Firestore({ + projectId: 'your-project-id', + databaseId: 'your-new-enterprise-database' + }); + }); + + async function basicRead() { + // [START basic_read] + const readDataPipeline = db.pipeline() + .collection("users"); + + // Execute the pipeline and handle the result + try { + const querySnapshot = await readDataPipeline.execute(); + querySnapshot.results.forEach((result) => { + console.log(`${result.id} => ${result.data()}`); + }); + } catch (error) { + console.error("Error getting documents: ", error); + } + // [END basic_read] + } + + function pipelineConcepts() { + // [START pipeline_concepts] + const pipeline = db.pipeline() + // Step 1: Start a query with collection scope + .collection("cities") + // Step 2: Filter the collection + .where(field("population").greaterThan(100000)) + // Step 3: Sort the remaining documents + .sort(field("name").ascending()) + // Step 4: Return the top 10. Note applying the limit earlier in the + // pipeline would have unintentional results. + .limit(10); + // [END pipeline_concepts] + console.log(pipeline); + } + + function pipelineInitialization() { + // [START pipeline_initialization] + const { Firestore } = require("@google-cloud/firestore"); + const database = new Firestore({ + projectId: 'your-project-id', + databaseId: 'your-new-enterprise-database' + }); + const pipeline = database.pipeline(); + // [END pipeline_initialization] + console.log(pipeline); + } + + function fieldVsConstants() { + // [START field_or_constant] + const pipeline = db.pipeline() + .collection("cities") + .where(field("name").equal(constant("Toronto"))); + // [END field_or_constant] + console.log(pipeline); + } + + async function inputStages() { + // [START input_stages] + let results; + + // Return all restaurants in San Francisco + results = await db.pipeline().collection("cities/sf/restaurants").execute(); + + // Return all restaurants + results = await db.pipeline().collectionGroup("restaurants").execute(); + + // Return all documents across all collections in the database (the entire database) + results = await db.pipeline().database().execute(); + + // Batch read of 3 documents + results = await db.pipeline().documents([ + db.collection("cities").doc("SF"), + db.collection("cities").doc("DC"), + db.collection("cities").doc("NY"), + ]).execute(); + // [END input_stages] + console.log(results); + } + + async function wherePipeline() { + // [START pipeline_where] + let results; + + results = await db.pipeline().collection("books") + .where(field("rating").equal(5)) + .where(field("published").lessThan(1900)) + .execute(); + + results = await db.pipeline().collection("books") + .where(and(field("rating").equal(5), field("published").lessThan(1900))) + .execute(); + // [END pipeline_where] + console.log(results); + } + + async function aggregateGroups() { + // [START aggregate_groups] + const results = await db.pipeline() + .collection("books") + .aggregate( + field("rating").average().as("avg_rating") + ) + .distinct(field("genre")) + .execute(); + // [END aggregate_groups] + console.log(results); + } + + async function aggregateDistinct() { + // [START aggregate_distinct] + const results = await db.pipeline() + .collection("books") + .distinct( + field("author").toUpper().as("author"), + field("genre") + ) + .execute(); + // [END aggregate_distinct] + console.log(results); + } + + async function sort() { + // [START sort] + const results = await db.pipeline() + .collection("books") + .sort( + field("release_date").descending(), field("author").ascending() + ) + .execute(); + // [END sort] + console.log(results); + } + + function sortComparison() { + // [START sort_comparison] + const q = db.collection("cities") + .orderBy("state") + .orderBy("population", "desc"); + + const pipeline = db.pipeline() + .collection("books") + .sort( + field("release_date").descending(), field("author").ascending() + ); + // [END sort_comparison] + console.log(q); + console.log(pipeline); + } + + async function functions() { + // [START functions_example] + let results; + + // Type 1: Scalar (for use in non-aggregation stages) + // Example: Return the min store price for each book. + results = await db.pipeline().collection("books") + .select(field("current").logicalMinimum(field("updated")).as("price_min")) + .execute(); + + // Type 2: Aggregation (for use in aggregate stages) + // Example: Return the min price of all books. + results = await db.pipeline().collection("books") + .aggregate(field("price").minimum().as("min_price")) + .execute(); + // [END functions_example] + console.log(results); + } + + async function creatingIndexes() { + // [START query_example] + const results = await db.pipeline() + .collection("books") + .where(field("published").lessThan(1900)) + .where(field("genre").equal("Science Fiction")) + .where(field("rating").greaterThan(4.3)) + .sort(field("published").descending()) + .execute(); + // [END query_example] + console.log(results); + } + + async function sparseIndexes() { + // [START sparse_index_example] + const results = await db.pipeline() + .collection("books") + .where(like(field("category"), "%fantasy%")) + .execute(); + // [END sparse_index_example] + console.log(results); + } + + async function sparseIndexes2() { + // [START sparse_index_example_2] + const results = await db.pipeline() + .collection("books") + .sort(field("release_date").ascending()) + .execute(); + // [END sparse_index_example_2] + console.log(results); + } + + async function coveredQuery() { + // [START covered_query] + const results = await db.pipeline() + .collection("books") + .where(like(field("category"), "%fantasy%")) + .where(field("title").exists()) + .where(field("author").exists()) + .select(field("title"), field("author")) + .execute(); + // [END covered_query] + console.log(results); + } + + async function pagination() { + // [START pagination_not_supported_preview] + // Existing pagination via `startAt()` + const q = + db.collection("cities").orderBy("population").startAt(1000000); + + // Private preview workaround using pipelines + const pageSize = 2; + const pipeline = db.pipeline() + .collection("cities") + .select("name", "population", "__name__") + .sort(field("population").descending(), field("__name__").ascending()); + + // Page 1 results + let snapshot = await pipeline.limit(pageSize).execute(); + + // End of page marker + const lastDoc = snapshot.results[snapshot.results.length - 1]; + + // Page 2 results + snapshot = await pipeline + .where( + or( + and( + field("population").equal(lastDoc.get("population")), + field("__name__").greaterThan(lastDoc.ref) + ), + field("population").lessThan(lastDoc.get("population")) + ) + ) + .limit(pageSize) + .execute(); + // [END pagination_not_supported_preview] + console.log(q); + console.log(pipeline); + } + + async function collectionStage() { + // [START collection_example] + const results = await db.pipeline() + .collection("users/bob/games") + .sort(field("name").ascending()) + .execute(); + // [END collection_example] + console.log(results); + } + + async function collectionGroupStage() { + // [START collection_group_example] + const results = await db.pipeline() + .collectionGroup("games") + .sort(field("name").ascending()) + .execute(); + // [END collection_group_example] + console.log(results); + } + + async function databaseStage() { + // [START database_example] + // Count all documents in the database + const results = await db.pipeline() + .database() + .aggregate(countAll().as("total")) + .execute(); + // [END database_example] + console.log(results); + } + + async function documentsStage() { + // [START documents_example] + const results = await db.pipeline() + .documents([ + db.collection("cities").doc("SF"), + db.collection("cities").doc("DC"), + db.collection("cities").doc("NY") + ]) + .execute(); + // [END documents_example] + console.log(results); + } + + async function replaceWithStage() { + // [START initial_data] + await db.collection("cities").doc("SF").set({ + "name": "San Francisco", + "population": 800000, + "location": { + "country": "USA", + "state": "California" + } + }); + await db.collection("cities").doc("TO").set({ + "name": "Toronto", + "population": 3000000, + "province": "ON", + "location": { + "country": "Canada", + "province": "Ontario" + } + }); + await db.collection("cities").doc("NY").set({ + "name": "New York", + "location": { + "country": "USA", + "state": "New York" + } + }); + await db.collection("cities").doc("AT").set({ + "name": "Atlantis", + }); + // [END initial_data] + + // [START full_replace] + const names = await db.pipeline() + .collection("cities") + .replaceWith(field("location")) + .execute(); + // [END full_replace] + + // [START map_merge_overwrite] + // unsupported in client SDKs for now + // [END map_merge_overwrite] + console.log(names); + } + + async function sampleStage() { + // [START sample_example] + let results; + + // Get a sample of 100 documents in a database + results = await db.pipeline() + .database() + .sample(100) + .execute(); + + // Randomly shuffle a list of 3 documents + results = await db.pipeline() + .documents([ + db.collection("cities").doc("SF"), + db.collection("cities").doc("DC"), + db.collection("cities").doc("NY") + ]) + .sample(3) + .execute(); + // [END sample_example] + console.log(results); + } + + async function samplePercent() { + // [START sample_percent] + // Get a sample of on average 50% of the documents in the database + const results = await db.pipeline() + .database() + .sample({ percentage: 0.5 }) + .execute(); + // [END sample_percent] + console.log(results); + } + + async function unionStage() { + // [START union_stage] + const results = await db.pipeline() + .collection("cities/SF/restaurants") + .where(field("type").equal("Chinese")) + .union(db.pipeline() + .collection("cities/NY/restaurants") + .where(field("type").equal("Italian"))) + .where(field("rating").greaterThanOrEqual(4.5)) + .sort(field("__name__").descending()) + .execute(); + // [END union_stage] + console.log(results); + } + + async function unnestStage() { + // [START unnest_stage] + const results = await db.pipeline() + .database() + .unnest(field("arrayField").as("unnestedArrayField"), "index") + .execute(); + // [END unnest_stage] + console.log(results); + } + + async function unnestStageEmptyOrNonArray() { + // [START unnest_edge_cases] + // Input + // { identifier : 1, neighbors: [ "Alice", "Cathy" ] } + // { identifier : 2, neighbors: [] } + // { identifier : 3, neighbors: "Bob" } + + const results = await db.pipeline() + .database() + .unnest(field("neighbors").as("unnestedNeighbors"), "index" ) + .execute(); + + // Output + // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Alice", index: 0 } + // { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Cathy", index: 1 } + // { identifier: 3, neighbors: "Bob", index: null} + // [END unnest_edge_cases] + console.log(results); + } + + async function countFunction() { + // [START count_function] + // Total number of books in the collection + const countOfAll = await db.pipeline() + .collection("books") + .aggregate(countAll().as("count")) + .execute(); + + // Number of books with nonnull `ratings` field + const countField = await db.pipeline() + .collection("books") + .aggregate(field("ratings").count().as("count")) + .execute(); + // [END count_function] + console.log(countOfAll); + console.log(countField); + } + + async function countIfFunction() { + // [START count_if] + const result = await db.pipeline() + .collection("books") + .aggregate( + field("rating").greaterThan(4).countIf().as("filteredCount") + ) + .execute(); + // [END count_if] + console.log(result); + } + + async function countDistinctFunction() { + // [START count_distinct] + const result = await db.pipeline() + .collection("books") + .aggregate(field("author").countDistinct().as("unique_authors")) + .execute(); + // [END count_distinct] + console.log(result); + } + + async function sumFunction() { + // [START sum_function] + const result = await db.pipeline() + .collection("cities") + .aggregate(field("population").sum().as("totalPopulation")) + .execute(); + // [END sum_function] + console.log(result); + } + + async function avgFunction() { + // [START avg_function] + const result = await db.pipeline() + .collection("cities") + .aggregate(field("population").average().as("averagePopulation")) + .execute(); + // [END avg_function] + console.log(result); + } + + async function minFunction() { + // [START min_function] + const result = await db.pipeline() + .collection("books") + .aggregate(field("price").minimum().as("minimumPrice")) + .execute(); + // [END min_function] + console.log(result); + } + + async function maxFunction() { + // [START max_function] + const result = await db.pipeline() + .collection("books") + .aggregate(field("price").maximum().as("maximumPrice")) + .execute(); + // [END max_function] + console.log(result); + } + + async function addFunction() { + // [START add_function] + const result = await db.pipeline() + .collection("books") + .select(field("soldBooks").add(field("unsoldBooks")).as("totalBooks")) + .execute(); + // [END add_function] + console.log(result); + } + + async function subtractFunction() { + // [START subtract_function] + const storeCredit = 7; + const result = await db.pipeline() + .collection("books") + .select(field("price").subtract(constant(storeCredit)).as("totalCost")) + .execute(); + // [END subtract_function] + console.log(result); + } + + async function multiplyFunction() { + // [START multiply_function] + const result = await db.pipeline() + .collection("books") + .select(field("price").multiply(field("soldBooks")).as("revenue")) + .execute(); + // [END multiply_function] + console.log(result); + } + + async function divideFunction() { + // [START divide_function] + const result = await db.pipeline() + .collection("books") + .select(field("ratings").divide(field("soldBooks")).as("reviewRate")) + .execute(); + // [END divide_function] + console.log(result); + } + + async function modFunction() { + // [START mod_function] + const displayCapacity = 1000; + const result = await db.pipeline() + .collection("books") + .select(field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")) + .execute(); + // [END mod_function] + console.log(result); + } + + async function ceilFunction() { + // [START ceil_function] + const booksPerShelf = 100; + const result = await db.pipeline() + .collection("books") + .select( + field("unsoldBooks").divide(constant(booksPerShelf)).ceil().as("requiredShelves") + ) + .execute(); + // [END ceil_function] + console.log(result); + } + + async function floorFunction() { + // [START floor_function] + const result = await db.pipeline() + .collection("books") + .addFields( + field("wordCount").divide(field("pages")).floor().as("wordsPerPage") + ) + .execute(); + // [END floor_function] + console.log(result); + } + + async function roundFunction() { + // [START round_function] + const result = await db.pipeline() + .collection("books") + .select(field("soldBooks").multiply(field("price")).round().as("partialRevenue")) + .aggregate(field("partialRevenue").sum().as("totalRevenue")) + .execute(); + // [END round_function] + console.log(result); + } + + async function powFunction() { + // [START pow_function] + const googleplex = { latitude: 37.4221, longitude: 122.0853 }; + const result = await db.pipeline() + .collection("cities") + .addFields( + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ) + .select( + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ) + .execute(); + // [END pow_function] + console.log(result); + } + + async function sqrtFunction() { + // [START sqrt_function] + const googleplex = { latitude: 37.4221, longitude: 122.0853 }; + const result = await db.pipeline() + .collection("cities") + .addFields( + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ) + .select( + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ) + .execute(); + // [END sqrt_function] + console.log(result); + } + + async function expFunction() { + // [START exp_function] + const result = await db.pipeline() + .collection("books") + .select(field("rating").exp().as("expRating")) + .execute(); + // [END exp_function] + console.log(result); + } + + async function lnFunction() { + // [START ln_function] + const result = await db.pipeline() + .collection("books") + .select(field("rating").ln().as("lnRating")) + .execute(); + // [END ln_function] + console.log(result); + } + + async function logFunction() { + // [START log_function] + // Not supported on JS + // [END log_function] + } + + async function arrayConcat() { + // [START array_concat] + const result = await db.pipeline() + .collection("books") + .select(field("genre").arrayConcat([field("subGenre")]).as("allGenres")) + .execute(); + // [END array_concat] + console.log(result); + } + + async function arrayContains() { + // [START array_contains] + const result = await db.pipeline() + .collection("books") + .select(field("genre").arrayContains(constant("mystery")).as("isMystery")) + .execute(); + // [END array_contains] + console.log(result); + } + + async function arrayContainsAll() { + // [START array_contains_all] + const result = await db.pipeline() + .collection("books") + .select( + field("genre") + .arrayContainsAll([constant("fantasy"), constant("adventure")]) + .as("isFantasyAdventure") + ) + .execute(); + // [END array_contains_all] + console.log(result); + } + + async function arrayContainsAny() { + // [START array_contains_any] + const result = await db.pipeline() + .collection("books") + .select( + field("genre") + .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) + .as("isMysteryOrFantasy") + ) + .execute(); + // [END array_contains_any] + console.log(result); + } + + async function arrayLength() { + // [START array_length] + const result = await db.pipeline() + .collection("books") + .select(field("genre").arrayLength().as("genreCount")) + .execute(); + // [END array_length] + console.log(result); + } + + async function arrayReverseSnippet() { + // [START array_reverse] + const result = await db.pipeline() + .collection("books") + .select(arrayReverse(field("genre")).as("reversedGenres")) + .execute(); + // [END array_reverse] + console.log(result); + } + + async function equalFunction() { + // [START equal_function] + const result = await db.pipeline() + .collection("books") + .select(field("rating").equal(5).as("hasPerfectRating")) + .execute(); + // [END equal_function] + console.log(result); + } + + async function greaterThanFunction() { + // [START greater_than] + const result = await db.pipeline() + .collection("books") + .select(field("rating").greaterThan(4).as("hasHighRating")) + .execute(); + // [END greater_than] + console.log(result); + } + + async function greaterThanOrEqualToFunction() { + // [START greater_or_equal] + const result = await db.pipeline() + .collection("books") + .select(field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")) + .execute(); + // [END greater_or_equal] + console.log(result); + } + + async function lessThanFunction() { + // [START less_than] + const result = await db.pipeline() + .collection("books") + .select(field("published").lessThan(1923).as("isPublicDomainProbably")) + .execute(); + // [END less_than] + console.log(result); + } + + async function lessThanOrEqualToFunction() { + // [START less_or_equal] + const result = await db.pipeline() + .collection("books") + .select(field("rating").lessThanOrEqual(2).as("hasBadRating")) + .execute(); + // [END less_or_equal] + console.log(result); + } + + async function notEqualFunction() { + // [START not_equal] + const result = await db.pipeline() + .collection("books") + .select(field("title").notEqual("1984").as("not1984")) + .execute(); + // [END not_equal] + console.log(result); + } + + async function existsFunction() { + // [START exists_function] + const result = await db.pipeline() + .collection("books") + .select(field("rating").exists().as("hasRating")) + .execute(); + // [END exists_function] + console.log(result); + } + + async function andFunction() { + // [START and_function] + const result = await db.pipeline() + .collection("books") + .select( + and(field("rating").greaterThan(4), field("price").lessThan(10)) + .as("under10Recommendation") + ) + .execute(); + // [END and_function] + console.log(result); + } + + async function orFunction() { + // [START or_function] + const result = await db.pipeline() + .collection("books") + .select( + or(field("genre").equal("Fantasy"), field("tags").arrayContains("adventure")) + .as("matchesSearchFilters") + ) + .execute(); + // [END or_function] + console.log(result); + } + + async function xorFunction() { + // [START xor_function] + const result = await db.pipeline() + .collection("books") + .select( + xor(field("tags").arrayContains("magic"), field("tags").arrayContains("nonfiction")) + .as("matchesSearchFilters") + ) + .execute(); + // [END xor_function] + console.log(result); + } + + async function notFunction() { + // [START not_function] + const result = await db.pipeline() + .collection("books") + .select( + field("tags").arrayContains("nonfiction").not() + .as("isFiction") + ) + .execute(); + // [END not_function] + console.log(result); + } + + async function condFunction() { + // [START cond_function] + const result = await db.pipeline() + .collection("books") + .select( + field("tags").arrayConcat([ + conditional( + field("pages").greaterThan(100), + constant("longRead"), + constant("shortRead") + ) + ]).as("extendedTags") + ) + .execute(); + // [END cond_function] + console.log(result); + } + + async function equalAnyFunction() { + // [START eq_any] + const result = await db.pipeline() + .collection("books") + .select( + field("genre").equalAny(["Science Fiction", "Psychological Thriller"]) + .as("matchesGenreFilters") + ) + .execute(); + // [END eq_any] + console.log(result); + } + + async function notEqualAnyFunction() { + // [START not_eq_any] + const result = await db.pipeline() + .collection("books") + .select( + field("author").notEqualAny(["George Orwell", "F. Scott Fitzgerald"]) + .as("byExcludedAuthors") + ) + .execute(); + // [END not_eq_any] + console.log(result); + } + + async function maxLogicalFunction() { + // [START max_logical_function] + const result = await db.pipeline() + .collection("books") + .select( + field("rating").logicalMaximum(1).as("flooredRating") + ) + .execute(); + // [END max_logical_function] + console.log(result); + } + + async function minLogicalFunction() { + // [START min_logical_function] + const result = await db.pipeline() + .collection("books") + .select( + field("rating").logicalMinimum(5).as("cappedRating") + ) + .execute(); + // [END min_logical_function] + console.log(result); + } + + async function mapGetFunction() { + // [START map_get] + const result = await db.pipeline() + .collection("books") + .select( + field("awards").mapGet("pulitzer").as("hasPulitzerAward") + ) + .execute(); + // [END map_get] + console.log(result); + } + + async function byteLengthFunction() { + // [START byte_length] + const result = await db.pipeline() + .collection("books") + .select( + field("title").byteLength().as("titleByteLength") + ) + .execute(); + // [END byte_length] + console.log(result); + } + + async function charLengthFunction() { + // [START char_length] + const result = await db.pipeline() + .collection("books") + .select( + field("title").charLength().as("titleCharLength") + ) + .execute(); + // [END char_length] + console.log(result); + } + + async function startsWithFunction() { + // [START starts_with] + const result = await db.pipeline() + .collection("books") + .select( + field("title").startsWith("The") + .as("needsSpecialAlphabeticalSort") + ) + .execute(); + // [END starts_with] + console.log(result); + } + + async function endsWithFunction() { + // [START ends_with] + const result = await db.pipeline() + .collection("inventory/devices/laptops") + .select( + field("name").endsWith("16 inch") + .as("16InLaptops") + ) + .execute(); + // [END ends_with] + console.log(result); + } + + async function likeFunction() { + // [START like] + const result = await db.pipeline() + .collection("books") + .select( + field("genre").like("%Fiction") + .as("anyFiction") + ) + .execute(); + // [END like] + console.log(result); + } + + async function regexContainsFunction() { + // [START regex_contains] + const result = await db.pipeline() + .collection("documents") + .select( + field("title").regexContains("Firestore (Enterprise|Standard)") + .as("isFirestoreRelated") + ) + .execute(); + // [END regex_contains] + console.log(result); + } + + async function regexMatchFunction() { + // [START regex_match] + const result = await db.pipeline() + .collection("documents") + .select( + field("title").regexMatch("Firestore (Enterprise|Standard)") + .as("isFirestoreExactly") + ) + .execute(); + // [END regex_match] + console.log(result); + } + + async function strConcatFunction() { + // [START str_concat] + const result = await db.pipeline() + .collection("books") + .select( + field("title").stringConcat(" by ", field("author")) + .as("fullyQualifiedTitle") + ) + .execute(); + // [END str_concat] + console.log(result); + } + + async function strContainsFunction() { + // [START string_contains] + const result = await db.pipeline() + .collection("articles") + .select( + field("body").stringContains("Firestore") + .as("isFirestoreRelated") + ) + .execute(); + // [END string_contains] + console.log(result); + } + + async function toUpperFunction() { + // [START to_upper] + const result = await db.pipeline() + .collection("authors") + .select( + field("name").toUpper() + .as("uppercaseName") + ) + .execute(); + // [END to_upper] + console.log(result); + } + + async function toLowerFunction() { + // [START to_lower] + const result = await db.pipeline() + .collection("authors") + .select( + field("genre").toLower().equal("fantasy") + .as("isFantasy") + ) + .execute(); + // [END to_lower] + } + + async function substrFunction() { + // [START substr_function] + const result = await db.pipeline() + .collection("books") + .where(field("title").startsWith("The ")) + .select( + field("title").substring(4) + .as("titleWithoutLeadingThe") + ) + .execute(); + // [END substr_function] + console.log(result); + } + + async function strReverseFunction() { + // [START str_reverse] + const result = await db.pipeline() + .collection("books") + .select( + field("name").reverse().as("reversedName") + ) + .execute(); + // [END str_reverse] + console.log(result); + } + + async function strTrimFunction() { + // [START trim_function] + const result = await db.pipeline() + .collection("books") + .select( + field("name").trim().as("whitespaceTrimmedName") + ) + .execute(); + // [END trim_function] + console.log(result); + } + + async function strReplaceFunction() { + // not yet supported until GA + } + + async function strSplitFunction() { + // not yet supported until GA + } + + async function unixMicrosToTimestampFunction() { + // [START unix_micros_timestamp] + const result = await db.pipeline() + .collection("documents") + .select( + field("createdAtMicros").unixMicrosToTimestamp().as("createdAtString") + ) + .execute(); + // [END unix_micros_timestamp] + console.log(result); + } + + async function unixMillisToTimestampFunction() { + // [START unix_millis_timestamp] + const result = await db.pipeline() + .collection("documents") + .select( + field("createdAtMillis").unixMillisToTimestamp().as("createdAtString") + ) + .execute(); + // [END unix_millis_timestamp] + console.log(result); + } + + async function unixSecondsToTimestampFunction() { + // [START unix_seconds_timestamp] + const result = await db.pipeline() + .collection("documents") + .select( + field("createdAtSeconds").unixSecondsToTimestamp().as("createdAtString") + ) + .execute(); + // [END unix_seconds_timestamp] + console.log(result); + } + + async function timestampAddFunction() { + // [START timestamp_add] + const result = await db.pipeline() + .collection("documents") + .select( + field("createdAt").timestampAdd("day", 3653).as("expiresAt") + ) + .execute(); + // [END timestamp_add] + console.log(result); + } + + async function timestampSubFunction() { + // [START timestamp_sub] + const result = await db.pipeline() + .collection("documents") + .select( + field("expiresAt").timestampSubtract("day", 14).as("sendWarningTimestamp") + ) + .execute(); + // [END timestamp_sub] + console.log(result); + } + + async function timestampToUnixMicrosFunction() { + // [START timestamp_unix_micros] + const result = await db.pipeline() + .collection("documents") + .select( + field("dateString").timestampToUnixMicros().as("unixMicros") + ) + .execute(); + // [END timestamp_unix_micros] + console.log(result); + } + + async function timestampToUnixMillisFunction() { + // [START timestamp_unix_millis] + const result = await db.pipeline() + .collection("documents") + .select( + field("dateString").timestampToUnixMillis().as("unixMillis") + ) + .execute(); + // [END timestamp_unix_millis] + console.log(result); + } + + async function timestampToUnixSecondsFunction() { + // [START timestamp_unix_seconds] + const result = await db.pipeline() + .collection("documents") + .select( + field("dateString").timestampToUnixSeconds().as("unixSeconds") + ) + .execute(); + // [END timestamp_unix_seconds] + console.log(result); + } + + async function cosineDistanceFunction() { + // [START cosine_distance] + const sampleVector = [0.0, 1, 2, 3, 4, 5]; + const result = await db.pipeline() + .collection("books") + .select( + field("embedding").cosineDistance(sampleVector).as("cosineDistance") + ) + .execute(); + // [END cosine_distance] + console.log(result); + } + + async function dotProductFunction() { + // [START dot_product] + const sampleVector = [0.0, 1, 2, 3, 4, 5]; + const result = await db.pipeline() + .collection("books") + .select( + field("embedding").dotProduct(sampleVector).as("dotProduct") + ) + .execute(); + // [END dot_product] + console.log(result); + } + + async function euclideanDistanceFunction() { + // [START euclidean_distance] + const sampleVector = [0.0, 1, 2, 3, 4, 5]; + const result = await db.pipeline() + .collection("books") + .select( + field("embedding").euclideanDistance(sampleVector).as("euclideanDistance") + ) + .execute(); + // [END euclidean_distance] + console.log(result); + } + + async function vectorLengthFunction() { + // [START vector_length] + const result = await db.pipeline() + .collection("books") + .select( + field("embedding").vectorLength().as("vectorLength") + ) + .execute(); + // [END vector_length] + console.log(result); + } +}); diff --git a/snippets/firestore-next/test-firestore/and_function.js b/snippets/firestore-next/test-firestore/and_function.js index 27e40a44..f84865be 100644 --- a/snippets/firestore-next/test-firestore/and_function.js +++ b/snippets/firestore-next/test-firestore/and_function.js @@ -8,7 +8,7 @@ const result = await execute(db.pipeline() .collection("books") .select( - and(field("rating").greaterThan(4), (field("price").lessThan(10))) + and(field("rating").greaterThan(4), field("price").lessThan(10)) .as("under10Recommendation") ) ); diff --git a/snippets/firestore-next/test-firestore/functions_example.js b/snippets/firestore-next/test-firestore/functions_example.js index cdc86768..b1a80aeb 100644 --- a/snippets/firestore-next/test-firestore/functions_example.js +++ b/snippets/firestore-next/test-firestore/functions_example.js @@ -10,9 +10,7 @@ let results; // Type 1: Scalar (for use in non-aggregation stages) // Example: Return the min store price for each book. results = await execute(db.pipeline().collection("books") - .select( - field("current").logicalMinimum(["updated"]).as("price_min") - ) + .select(field("current").logicalMinimum(field("updated")).as("price_min")) ); // Type 2: Aggregation (for use in aggregate stages) diff --git a/snippets/firestore-next/test-firestore/max_logical_function.js b/snippets/firestore-next/test-firestore/max_logical_function.js index 196e0ebd..e884226f 100644 --- a/snippets/firestore-next/test-firestore/max_logical_function.js +++ b/snippets/firestore-next/test-firestore/max_logical_function.js @@ -8,7 +8,7 @@ const result = await execute(db.pipeline() .collection("books") .select( - field("rating").logicalMaximum([1]).as("flooredRating") + field("rating").logicalMaximum(1).as("flooredRating") ) ); // [END max_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/min_logical_function.js b/snippets/firestore-next/test-firestore/min_logical_function.js index aa2ea820..91ae75a1 100644 --- a/snippets/firestore-next/test-firestore/min_logical_function.js +++ b/snippets/firestore-next/test-firestore/min_logical_function.js @@ -8,7 +8,7 @@ const result = await execute(db.pipeline() .collection("books") .select( - field("rating").logicalMinimum([5]).as("cappedRating") + field("rating").logicalMinimum(5).as("cappedRating") ) ); // [END min_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/not_function.js b/snippets/firestore-next/test-firestore/not_function.js index 9324b74e..f6905f23 100644 --- a/snippets/firestore-next/test-firestore/not_function.js +++ b/snippets/firestore-next/test-firestore/not_function.js @@ -8,7 +8,7 @@ const result = await execute(db.pipeline() .collection("books") .select( - (field("tags").arrayContains("nonfiction").not()) + field("tags").arrayContains("nonfiction").not() .as("isFiction") ) ); diff --git a/snippets/firestore-next/test-firestore/or_function.js b/snippets/firestore-next/test-firestore/or_function.js index 4199bdce..035512d7 100644 --- a/snippets/firestore-next/test-firestore/or_function.js +++ b/snippets/firestore-next/test-firestore/or_function.js @@ -8,7 +8,7 @@ const result = await execute(db.pipeline() .collection("books") .select( - or(field("genre").equal("Fantasy"), (field("tags").arrayContains("adventure"))) + or(field("genre").equal("Fantasy"), field("tags").arrayContains("adventure")) .as("matchesSearchFilters") ) ); diff --git a/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js b/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js index 4a78a54d..02687926 100644 --- a/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js +++ b/snippets/firestore-next/test-firestore/pagination_not_supported_preview.js @@ -6,12 +6,34 @@ // [START pagination_not_supported_preview_modular] // Existing pagination via `startAt()` -const q = // db.collection("cities").orderBy("population").startAt(1000000); +const q = query(collection(db, "cities"), orderBy("population"), startAt(1000000)); // Private preview workaround using pipelines +const pageSize = 2; const pipeline = db.pipeline() .collection("cities") - .where(field("population").greaterThanOrEqual(1000000)) - .sort(field("population").descending()); + .select("name", "population", "__name__") + .sort(field("population").descending(), field("__name__").ascending()); + +// Page 1 results +let snapshot = await execute(pipeline.limit(pageSize)); + +// End of page marker +const lastDoc = snapshot.results[snapshot.results.length - 1]; + +// Page 2 results +snapshot = await execute( + pipeline + .where( + or( + and( + field("population").equal(lastDoc.get("population")), + field("__name__").greaterThan(lastDoc.ref) + ), + field("population").lessThan(lastDoc.get("population")) + ) + ) + .limit(pageSize) +); // [END pagination_not_supported_preview_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/pipeline_where.js b/snippets/firestore-next/test-firestore/pipeline_where.js index e4ca5182..7e7bd55e 100644 --- a/snippets/firestore-next/test-firestore/pipeline_where.js +++ b/snippets/firestore-next/test-firestore/pipeline_where.js @@ -13,6 +13,6 @@ results = await execute(db.pipeline().collection("books") ); results = await execute(db.pipeline().collection("books") - .where(and(field("rating").equal(5), (field("published").lessThan(1900)))) + .where(and(field("rating").equal(5), field("published").lessThan(1900))) ); // [END pipeline_where_modular] \ No newline at end of file diff --git a/snippets/firestore-next/test-firestore/xor_function.js b/snippets/firestore-next/test-firestore/xor_function.js index d8812705..f4523929 100644 --- a/snippets/firestore-next/test-firestore/xor_function.js +++ b/snippets/firestore-next/test-firestore/xor_function.js @@ -8,7 +8,7 @@ const result = await execute(db.pipeline() .collection("books") .select( - xor(field("tags").arrayContains("magic"), (field("tags").arrayContains("nonfiction"))) + xor(field("tags").arrayContains("magic"), field("tags").arrayContains("nonfiction")) .as("matchesSearchFilters") ) ); diff --git a/snippets/firestore-temp/test-firestore/add_function.js b/snippets/firestore-temp/test-firestore/add_function.js new file mode 100644 index 00000000..ff354a12 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/add_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START add_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("soldBooks").add(field("unsoldBooks")).as("totalBooks")) + .execute(); +// [END add_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/aggregate_distinct.js b/snippets/firestore-temp/test-firestore/aggregate_distinct.js new file mode 100644 index 00000000..ee5464d6 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/aggregate_distinct.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START aggregate_distinct_modular] +const results = await db.pipeline() + .collection("books") + .distinct( + field("author").toUpper().as("author"), + field("genre") + ) + .execute(); +// [END aggregate_distinct_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/aggregate_groups.js b/snippets/firestore-temp/test-firestore/aggregate_groups.js new file mode 100644 index 00000000..b45c26e6 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/aggregate_groups.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START aggregate_groups_modular] +const results = await db.pipeline() + .collection("books") + .aggregate( + field("rating").average().as("avg_rating") + ) + .distinct(field("genre")) + .execute(); +// [END aggregate_groups_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/and_function.js b/snippets/firestore-temp/test-firestore/and_function.js new file mode 100644 index 00000000..817c21ea --- /dev/null +++ b/snippets/firestore-temp/test-firestore/and_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START and_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + and(field("rating").greaterThan(4), field("price").lessThan(10)) + .as("under10Recommendation") + ) + .execute(); +// [END and_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/array_concat.js b/snippets/firestore-temp/test-firestore/array_concat.js new file mode 100644 index 00000000..ac9d4482 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/array_concat.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_concat_modular] +const result = await db.pipeline() + .collection("books") + .select(field("genre").arrayConcat([field("subGenre")]).as("allGenres")) + .execute(); +// [END array_concat_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/array_contains.js b/snippets/firestore-temp/test-firestore/array_contains.js new file mode 100644 index 00000000..6b63e01a --- /dev/null +++ b/snippets/firestore-temp/test-firestore/array_contains.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_contains_modular] +const result = await db.pipeline() + .collection("books") + .select(field("genre").arrayContains(constant("mystery")).as("isMystery")) + .execute(); +// [END array_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/array_contains_all.js b/snippets/firestore-temp/test-firestore/array_contains_all.js new file mode 100644 index 00000000..d79e2250 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/array_contains_all.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_contains_all_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("genre") + .arrayContainsAll([constant("fantasy"), constant("adventure")]) + .as("isFantasyAdventure") + ) + .execute(); +// [END array_contains_all_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/array_contains_any.js b/snippets/firestore-temp/test-firestore/array_contains_any.js new file mode 100644 index 00000000..5ccbc3d5 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/array_contains_any.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_contains_any_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("genre") + .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) + .as("isMysteryOrFantasy") + ) + .execute(); +// [END array_contains_any_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/array_length.js b/snippets/firestore-temp/test-firestore/array_length.js new file mode 100644 index 00000000..2627557d --- /dev/null +++ b/snippets/firestore-temp/test-firestore/array_length.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_length_modular] +const result = await db.pipeline() + .collection("books") + .select(field("genre").arrayLength().as("genreCount")) + .execute(); +// [END array_length_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/array_reverse.js b/snippets/firestore-temp/test-firestore/array_reverse.js new file mode 100644 index 00000000..21b8ee7c --- /dev/null +++ b/snippets/firestore-temp/test-firestore/array_reverse.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START array_reverse_modular] +const result = await db.pipeline() + .collection("books") + .select(arrayReverse(field("genre")).as("reversedGenres")) + .execute(); +// [END array_reverse_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/avg_function.js b/snippets/firestore-temp/test-firestore/avg_function.js new file mode 100644 index 00000000..dc7b1a8e --- /dev/null +++ b/snippets/firestore-temp/test-firestore/avg_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START avg_function_modular] +const result = await db.pipeline() + .collection("cities") + .aggregate(field("population").average().as("averagePopulation")) + .execute(); +// [END avg_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/basic_read.js b/snippets/firestore-temp/test-firestore/basic_read.js new file mode 100644 index 00000000..9589129b --- /dev/null +++ b/snippets/firestore-temp/test-firestore/basic_read.js @@ -0,0 +1,20 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START basic_read_modular] +const readDataPipeline = db.pipeline() + .collection("users"); + +// Execute the pipeline and handle the result +try { + const querySnapshot = await readDataPipeline.execute(); + querySnapshot.results.forEach((result) => { + console.log(`${result.id} => ${result.data()}`); + }); +} catch (error) { + console.error("Error getting documents: ", error); +} +// [END basic_read_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/byte_length.js b/snippets/firestore-temp/test-firestore/byte_length.js new file mode 100644 index 00000000..1de8e3dc --- /dev/null +++ b/snippets/firestore-temp/test-firestore/byte_length.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START byte_length_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("title").byteLength().as("titleByteLength") + ) + .execute(); +// [END byte_length_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/ceil_function.js b/snippets/firestore-temp/test-firestore/ceil_function.js new file mode 100644 index 00000000..5adb33d7 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/ceil_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START ceil_function_modular] +const booksPerShelf = 100; +const result = await db.pipeline() + .collection("books") + .select( + field("unsoldBooks").divide(constant(booksPerShelf)).ceil().as("requiredShelves") + ) + .execute(); +// [END ceil_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/char_length.js b/snippets/firestore-temp/test-firestore/char_length.js new file mode 100644 index 00000000..4483d7bc --- /dev/null +++ b/snippets/firestore-temp/test-firestore/char_length.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START char_length_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("title").charLength().as("titleCharLength") + ) + .execute(); +// [END char_length_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/collection_example.js b/snippets/firestore-temp/test-firestore/collection_example.js new file mode 100644 index 00000000..05d3be56 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/collection_example.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START collection_example_modular] +const results = await db.pipeline() + .collection("users/bob/games") + .sort(field("name").ascending()) + .execute(); +// [END collection_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/collection_group_example.js b/snippets/firestore-temp/test-firestore/collection_group_example.js new file mode 100644 index 00000000..25c6d8da --- /dev/null +++ b/snippets/firestore-temp/test-firestore/collection_group_example.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START collection_group_example_modular] +const results = await db.pipeline() + .collectionGroup("games") + .sort(field("name").ascending()) + .execute(); +// [END collection_group_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/cond_function.js b/snippets/firestore-temp/test-firestore/cond_function.js new file mode 100644 index 00000000..e630d758 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/cond_function.js @@ -0,0 +1,20 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START cond_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("tags").arrayConcat([ + conditional( + field("pages").greaterThan(100), + constant("longRead"), + constant("shortRead") + ) + ]).as("extendedTags") + ) + .execute(); +// [END cond_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/cosine_distance.js b/snippets/firestore-temp/test-firestore/cosine_distance.js new file mode 100644 index 00000000..c5a4293a --- /dev/null +++ b/snippets/firestore-temp/test-firestore/cosine_distance.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START cosine_distance_modular] +const sampleVector = [0.0, 1, 2, 3, 4, 5]; +const result = await db.pipeline() + .collection("books") + .select( + field("embedding").cosineDistance(sampleVector).as("cosineDistance") + ) + .execute(); +// [END cosine_distance_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/count_distinct.js b/snippets/firestore-temp/test-firestore/count_distinct.js new file mode 100644 index 00000000..bb68e3f6 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/count_distinct.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START count_distinct_modular] +const result = await db.pipeline() + .collection("books") + .aggregate(field("author").countDistinct().as("unique_authors")) + .execute(); +// [END count_distinct_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/count_function.js b/snippets/firestore-temp/test-firestore/count_function.js new file mode 100644 index 00000000..aceba2d6 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/count_function.js @@ -0,0 +1,19 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START count_function_modular] +// Total number of books in the collection +const countOfAll = await db.pipeline() + .collection("books") + .aggregate(countAll().as("count")) + .execute(); + +// Number of books with nonnull `ratings` field +const countField = await db.pipeline() + .collection("books") + .aggregate(field("ratings").count().as("count")) + .execute(); +// [END count_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/count_if.js b/snippets/firestore-temp/test-firestore/count_if.js new file mode 100644 index 00000000..198574bc --- /dev/null +++ b/snippets/firestore-temp/test-firestore/count_if.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START count_if_modular] +const result = await db.pipeline() + .collection("books") + .aggregate( + field("rating").greaterThan(4).countIf().as("filteredCount") + ) + .execute(); +// [END count_if_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/covered_query.js b/snippets/firestore-temp/test-firestore/covered_query.js new file mode 100644 index 00000000..371a3c81 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/covered_query.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START covered_query_modular] +const results = await db.pipeline() + .collection("books") + .where(like(field("category"), "%fantasy%")) + .where(field("title").exists()) + .where(field("author").exists()) + .select(field("title"), field("author")) + .execute(); +// [END covered_query_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/database_example.js b/snippets/firestore-temp/test-firestore/database_example.js new file mode 100644 index 00000000..ab9c3f54 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/database_example.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START database_example_modular] +// Count all documents in the database +const results = await db.pipeline() + .database() + .aggregate(countAll().as("total")) + .execute(); +// [END database_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/divide_function.js b/snippets/firestore-temp/test-firestore/divide_function.js new file mode 100644 index 00000000..97507210 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/divide_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START divide_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("ratings").divide(field("soldBooks")).as("reviewRate")) + .execute(); +// [END divide_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/documents_example.js b/snippets/firestore-temp/test-firestore/documents_example.js new file mode 100644 index 00000000..a515dd36 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/documents_example.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START documents_example_modular] +const results = await db.pipeline() + .documents([ + db.collection("cities").doc("SF"), + db.collection("cities").doc("DC"), + db.collection("cities").doc("NY") + ]) + .execute(); +// [END documents_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/dot_product.js b/snippets/firestore-temp/test-firestore/dot_product.js new file mode 100644 index 00000000..f102e93d --- /dev/null +++ b/snippets/firestore-temp/test-firestore/dot_product.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START dot_product_modular] +const sampleVector = [0.0, 1, 2, 3, 4, 5]; +const result = await db.pipeline() + .collection("books") + .select( + field("embedding").dotProduct(sampleVector).as("dotProduct") + ) + .execute(); +// [END dot_product_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/ends_with.js b/snippets/firestore-temp/test-firestore/ends_with.js new file mode 100644 index 00000000..60b648e1 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/ends_with.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START ends_with_modular] +const result = await db.pipeline() + .collection("inventory/devices/laptops") + .select( + field("name").endsWith("16 inch") + .as("16InLaptops") + ) + .execute(); +// [END ends_with_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/eq_any.js b/snippets/firestore-temp/test-firestore/eq_any.js new file mode 100644 index 00000000..e73dde30 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/eq_any.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START eq_any_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("genre").equalAny(["Science Fiction", "Psychological Thriller"]) + .as("matchesGenreFilters") + ) + .execute(); +// [END eq_any_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/equal_function.js b/snippets/firestore-temp/test-firestore/equal_function.js new file mode 100644 index 00000000..36ae12ad --- /dev/null +++ b/snippets/firestore-temp/test-firestore/equal_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START equal_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("rating").equal(5).as("hasPerfectRating")) + .execute(); +// [END equal_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/euclidean_distance.js b/snippets/firestore-temp/test-firestore/euclidean_distance.js new file mode 100644 index 00000000..f8bf9e87 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/euclidean_distance.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START euclidean_distance_modular] +const sampleVector = [0.0, 1, 2, 3, 4, 5]; +const result = await db.pipeline() + .collection("books") + .select( + field("embedding").euclideanDistance(sampleVector).as("euclideanDistance") + ) + .execute(); +// [END euclidean_distance_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/exists_function.js b/snippets/firestore-temp/test-firestore/exists_function.js new file mode 100644 index 00000000..563c7b9e --- /dev/null +++ b/snippets/firestore-temp/test-firestore/exists_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START exists_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("rating").exists().as("hasRating")) + .execute(); +// [END exists_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/exp_function.js b/snippets/firestore-temp/test-firestore/exp_function.js new file mode 100644 index 00000000..a74efb19 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/exp_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START exp_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("rating").exp().as("expRating")) + .execute(); +// [END exp_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/field_or_constant.js b/snippets/firestore-temp/test-firestore/field_or_constant.js new file mode 100644 index 00000000..de7059c9 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/field_or_constant.js @@ -0,0 +1,11 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START field_or_constant_modular] +const pipeline = db.pipeline() + .collection("cities") + .where(field("name").equal(constant("Toronto"))); +// [END field_or_constant_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/floor_function.js b/snippets/firestore-temp/test-firestore/floor_function.js new file mode 100644 index 00000000..bc23f0fb --- /dev/null +++ b/snippets/firestore-temp/test-firestore/floor_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START floor_function_modular] +const result = await db.pipeline() + .collection("books") + .addFields( + field("wordCount").divide(field("pages")).floor().as("wordsPerPage") + ) + .execute(); +// [END floor_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/full_replace.js b/snippets/firestore-temp/test-firestore/full_replace.js new file mode 100644 index 00000000..9c2e3517 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/full_replace.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START full_replace_modular] +const names = await db.pipeline() + .collection("cities") + .replaceWith(field("location")) + .execute(); +// [END full_replace_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/functions_example.js b/snippets/firestore-temp/test-firestore/functions_example.js new file mode 100644 index 00000000..0c4d080b --- /dev/null +++ b/snippets/firestore-temp/test-firestore/functions_example.js @@ -0,0 +1,21 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START functions_example_modular] +let results; + +// Type 1: Scalar (for use in non-aggregation stages) +// Example: Return the min store price for each book. +results = await db.pipeline().collection("books") + .select(field("current").logicalMinimum(field("updated")).as("price_min")) + .execute(); + +// Type 2: Aggregation (for use in aggregate stages) +// Example: Return the min price of all books. +results = await db.pipeline().collection("books") + .aggregate(field("price").minimum().as("min_price")) + .execute(); +// [END functions_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/greater_or_equal.js b/snippets/firestore-temp/test-firestore/greater_or_equal.js new file mode 100644 index 00000000..77c01510 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/greater_or_equal.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START greater_or_equal_modular] +const result = await db.pipeline() + .collection("books") + .select(field("published").greaterThanOrEqual(1900).as("publishedIn20thCentury")) + .execute(); +// [END greater_or_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/greater_than.js b/snippets/firestore-temp/test-firestore/greater_than.js new file mode 100644 index 00000000..f727a8df --- /dev/null +++ b/snippets/firestore-temp/test-firestore/greater_than.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START greater_than_modular] +const result = await db.pipeline() + .collection("books") + .select(field("rating").greaterThan(4).as("hasHighRating")) + .execute(); +// [END greater_than_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/initial_data.js b/snippets/firestore-temp/test-firestore/initial_data.js new file mode 100644 index 00000000..0d8ea4b4 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/initial_data.js @@ -0,0 +1,35 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START initial_data_modular] +await db.collection("cities").doc("SF").set({ + "name": "San Francisco", + "population": 800000, + "location": { + "country": "USA", + "state": "California" + } +}); +await db.collection("cities").doc("TO").set({ + "name": "Toronto", + "population": 3000000, + "province": "ON", + "location": { + "country": "Canada", + "province": "Ontario" + } +}); +await db.collection("cities").doc("NY").set({ + "name": "New York", + "location": { + "country": "USA", + "state": "New York" + } +}); +await db.collection("cities").doc("AT").set({ + "name": "Atlantis", +}); +// [END initial_data_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/input_stages.js b/snippets/firestore-temp/test-firestore/input_stages.js new file mode 100644 index 00000000..432c0758 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/input_stages.js @@ -0,0 +1,25 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START input_stages_modular] +let results; + +// Return all restaurants in San Francisco +results = await db.pipeline().collection("cities/sf/restaurants").execute(); + +// Return all restaurants +results = await db.pipeline().collectionGroup("restaurants").execute(); + +// Return all documents across all collections in the database (the entire database) +results = await db.pipeline().database().execute(); + +// Batch read of 3 documents +results = await db.pipeline().documents([ + db.collection("cities").doc("SF"), + db.collection("cities").doc("DC"), + db.collection("cities").doc("NY"), +]).execute(); +// [END input_stages_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/less_or_equal.js b/snippets/firestore-temp/test-firestore/less_or_equal.js new file mode 100644 index 00000000..1e6d427a --- /dev/null +++ b/snippets/firestore-temp/test-firestore/less_or_equal.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START less_or_equal_modular] +const result = await db.pipeline() + .collection("books") + .select(field("rating").lessThanOrEqual(2).as("hasBadRating")) + .execute(); +// [END less_or_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/less_than.js b/snippets/firestore-temp/test-firestore/less_than.js new file mode 100644 index 00000000..f831bb91 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/less_than.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START less_than_modular] +const result = await db.pipeline() + .collection("books") + .select(field("published").lessThan(1923).as("isPublicDomainProbably")) + .execute(); +// [END less_than_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/like.js b/snippets/firestore-temp/test-firestore/like.js new file mode 100644 index 00000000..df0c5ffa --- /dev/null +++ b/snippets/firestore-temp/test-firestore/like.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START like_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("genre").like("%Fiction") + .as("anyFiction") + ) + .execute(); +// [END like_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/ln_function.js b/snippets/firestore-temp/test-firestore/ln_function.js new file mode 100644 index 00000000..31b3cd67 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/ln_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START ln_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("rating").ln().as("lnRating")) + .execute(); +// [END ln_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/log_function.js b/snippets/firestore-temp/test-firestore/log_function.js new file mode 100644 index 00000000..20add84a --- /dev/null +++ b/snippets/firestore-temp/test-firestore/log_function.js @@ -0,0 +1,9 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START log_function_modular] +// Not supported on JS +// [END log_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/map_get.js b/snippets/firestore-temp/test-firestore/map_get.js new file mode 100644 index 00000000..f08df243 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/map_get.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START map_get_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("awards").mapGet("pulitzer").as("hasPulitzerAward") + ) + .execute(); +// [END map_get_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/map_merge_overwrite.js b/snippets/firestore-temp/test-firestore/map_merge_overwrite.js new file mode 100644 index 00000000..92c1f05b --- /dev/null +++ b/snippets/firestore-temp/test-firestore/map_merge_overwrite.js @@ -0,0 +1,9 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START map_merge_overwrite_modular] +// unsupported in client SDKs for now +// [END map_merge_overwrite_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/max_function.js b/snippets/firestore-temp/test-firestore/max_function.js new file mode 100644 index 00000000..c553370a --- /dev/null +++ b/snippets/firestore-temp/test-firestore/max_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START max_function_modular] +const result = await db.pipeline() + .collection("books") + .aggregate(field("price").maximum().as("maximumPrice")) + .execute(); +// [END max_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/max_logical_function.js b/snippets/firestore-temp/test-firestore/max_logical_function.js new file mode 100644 index 00000000..fbe6ce26 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/max_logical_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START max_logical_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("rating").logicalMaximum(1).as("flooredRating") + ) + .execute(); +// [END max_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/min_function.js b/snippets/firestore-temp/test-firestore/min_function.js new file mode 100644 index 00000000..92978486 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/min_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START min_function_modular] +const result = await db.pipeline() + .collection("books") + .aggregate(field("price").minimum().as("minimumPrice")) + .execute(); +// [END min_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/min_logical_function.js b/snippets/firestore-temp/test-firestore/min_logical_function.js new file mode 100644 index 00000000..d2f8f0df --- /dev/null +++ b/snippets/firestore-temp/test-firestore/min_logical_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START min_logical_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("rating").logicalMinimum(5).as("cappedRating") + ) + .execute(); +// [END min_logical_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/mod_function.js b/snippets/firestore-temp/test-firestore/mod_function.js new file mode 100644 index 00000000..c7859f76 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/mod_function.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START mod_function_modular] +const displayCapacity = 1000; +const result = await db.pipeline() + .collection("books") + .select(field("unsoldBooks").mod(constant(displayCapacity)).as("warehousedBooks")) + .execute(); +// [END mod_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/multiply_function.js b/snippets/firestore-temp/test-firestore/multiply_function.js new file mode 100644 index 00000000..bbe1ca6f --- /dev/null +++ b/snippets/firestore-temp/test-firestore/multiply_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START multiply_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("price").multiply(field("soldBooks")).as("revenue")) + .execute(); +// [END multiply_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/not_eq_any.js b/snippets/firestore-temp/test-firestore/not_eq_any.js new file mode 100644 index 00000000..68fca3ee --- /dev/null +++ b/snippets/firestore-temp/test-firestore/not_eq_any.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START not_eq_any_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("author").notEqualAny(["George Orwell", "F. Scott Fitzgerald"]) + .as("byExcludedAuthors") + ) + .execute(); +// [END not_eq_any_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/not_equal.js b/snippets/firestore-temp/test-firestore/not_equal.js new file mode 100644 index 00000000..837f08a5 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/not_equal.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START not_equal_modular] +const result = await db.pipeline() + .collection("books") + .select(field("title").notEqual("1984").as("not1984")) + .execute(); +// [END not_equal_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/not_function.js b/snippets/firestore-temp/test-firestore/not_function.js new file mode 100644 index 00000000..1ecb8178 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/not_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START not_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("tags").arrayContains("nonfiction").not() + .as("isFiction") + ) + .execute(); +// [END not_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/or_function.js b/snippets/firestore-temp/test-firestore/or_function.js new file mode 100644 index 00000000..19ee8be3 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/or_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START or_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + or(field("genre").equal("Fantasy"), field("tags").arrayContains("adventure")) + .as("matchesSearchFilters") + ) + .execute(); +// [END or_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/pagination_not_supported_preview.js b/snippets/firestore-temp/test-firestore/pagination_not_supported_preview.js new file mode 100644 index 00000000..93a797f5 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/pagination_not_supported_preview.js @@ -0,0 +1,38 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pagination_not_supported_preview_modular] +// Existing pagination via `startAt()` +const q = + db.collection("cities").orderBy("population").startAt(1000000); + +// Private preview workaround using pipelines +const pageSize = 2; +const pipeline = db.pipeline() + .collection("cities") + .select("name", "population", "__name__") + .sort(field("population").descending(), field("__name__").ascending()); + +// Page 1 results +let snapshot = await pipeline.limit(pageSize).execute(); + +// End of page marker +const lastDoc = snapshot.results[snapshot.results.length - 1]; + +// Page 2 results +snapshot = await pipeline + .where( + or( + and( + field("population").equal(lastDoc.get("population")), + field("__name__").greaterThan(lastDoc.ref) + ), + field("population").lessThan(lastDoc.get("population")) + ) + ) + .limit(pageSize) + .execute(); +// [END pagination_not_supported_preview_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/pipeline_concepts.js b/snippets/firestore-temp/test-firestore/pipeline_concepts.js new file mode 100644 index 00000000..60e862b8 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/pipeline_concepts.js @@ -0,0 +1,18 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pipeline_concepts_modular] +const pipeline = db.pipeline() + // Step 1: Start a query with collection scope + .collection("cities") + // Step 2: Filter the collection + .where(field("population").greaterThan(100000)) + // Step 3: Sort the remaining documents + .sort(field("name").ascending()) + // Step 4: Return the top 10. Note applying the limit earlier in the + // pipeline would have unintentional results. + .limit(10); +// [END pipeline_concepts_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/pipeline_initialization.js b/snippets/firestore-temp/test-firestore/pipeline_initialization.js new file mode 100644 index 00000000..806986f6 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/pipeline_initialization.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pipeline_initialization_modular] +import { Firestore } from "@google-cloud/firestore"; +const database = new Firestore({ + projectId: 'your-project-id', + databaseId: 'your-new-enterprise-database' +}); +const pipeline = database.pipeline(); +// [END pipeline_initialization_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/pipeline_where.js b/snippets/firestore-temp/test-firestore/pipeline_where.js new file mode 100644 index 00000000..ab9ba88b --- /dev/null +++ b/snippets/firestore-temp/test-firestore/pipeline_where.js @@ -0,0 +1,18 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pipeline_where_modular] +let results; + +results = await db.pipeline().collection("books") + .where(field("rating").equal(5)) + .where(field("published").lessThan(1900)) + .execute(); + +results = await db.pipeline().collection("books") + .where(and(field("rating").equal(5), field("published").lessThan(1900))) + .execute(); +// [END pipeline_where_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/pow_function.js b/snippets/firestore-temp/test-firestore/pow_function.js new file mode 100644 index 00000000..e13d2117 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/pow_function.js @@ -0,0 +1,27 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START pow_function_modular] +const googleplex = { latitude: 37.4221, longitude: 122.0853 }; +const result = await db.pipeline() + .collection("cities") + .addFields( + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ) + .select( + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ) + .execute(); +// [END pow_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/query_example.js b/snippets/firestore-temp/test-firestore/query_example.js new file mode 100644 index 00000000..eb3ead85 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/query_example.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START query_example_modular] +const results = await db.pipeline() + .collection("books") + .where(field("published").lessThan(1900)) + .where(field("genre").equal("Science Fiction")) + .where(field("rating").greaterThan(4.3)) + .sort(field("published").descending()) + .execute(); +// [END query_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/regex_contains.js b/snippets/firestore-temp/test-firestore/regex_contains.js new file mode 100644 index 00000000..33b617f5 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/regex_contains.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START regex_contains_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("title").regexContains("Firestore (Enterprise|Standard)") + .as("isFirestoreRelated") + ) + .execute(); +// [END regex_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/regex_match.js b/snippets/firestore-temp/test-firestore/regex_match.js new file mode 100644 index 00000000..5dd8f123 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/regex_match.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START regex_match_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("title").regexMatch("Firestore (Enterprise|Standard)") + .as("isFirestoreExactly") + ) + .execute(); +// [END regex_match_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/round_function.js b/snippets/firestore-temp/test-firestore/round_function.js new file mode 100644 index 00000000..37017562 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/round_function.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START round_function_modular] +const result = await db.pipeline() + .collection("books") + .select(field("soldBooks").multiply(field("price")).round().as("partialRevenue")) + .aggregate(field("partialRevenue").sum().as("totalRevenue")) + .execute(); +// [END round_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/sample_example.js b/snippets/firestore-temp/test-firestore/sample_example.js new file mode 100644 index 00000000..e5cb7443 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/sample_example.js @@ -0,0 +1,25 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sample_example_modular] +let results; + +// Get a sample of 100 documents in a database +results = await db.pipeline() + .database() + .sample(100) + .execute(); + +// Randomly shuffle a list of 3 documents +results = await db.pipeline() + .documents([ + db.collection("cities").doc("SF"), + db.collection("cities").doc("DC"), + db.collection("cities").doc("NY") + ]) + .sample(3) + .execute(); +// [END sample_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/sample_percent.js b/snippets/firestore-temp/test-firestore/sample_percent.js new file mode 100644 index 00000000..bb6876e9 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/sample_percent.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sample_percent_modular] +// Get a sample of on average 50% of the documents in the database +const results = await db.pipeline() + .database() + .sample({ percentage: 0.5 }) + .execute(); +// [END sample_percent_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/sort.js b/snippets/firestore-temp/test-firestore/sort.js new file mode 100644 index 00000000..62dc86c4 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/sort.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sort_modular] +const results = await db.pipeline() + .collection("books") + .sort( + field("release_date").descending(), field("author").ascending() + ) + .execute(); +// [END sort_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/sort_comparison.js b/snippets/firestore-temp/test-firestore/sort_comparison.js new file mode 100644 index 00000000..d4c861a5 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/sort_comparison.js @@ -0,0 +1,17 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sort_comparison_modular] +const q = db.collection("cities") + .orderBy("state") + .orderBy("population", "desc"); + +const pipeline = db.pipeline() + .collection("books") + .sort( + field("release_date").descending(), field("author").ascending() + ); +// [END sort_comparison_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/sparse_index_example.js b/snippets/firestore-temp/test-firestore/sparse_index_example.js new file mode 100644 index 00000000..628ed8a6 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/sparse_index_example.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sparse_index_example_modular] +const results = await db.pipeline() + .collection("books") + .where(like(field("category"), "%fantasy%")) + .execute(); +// [END sparse_index_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/sqrt_function.js b/snippets/firestore-temp/test-firestore/sqrt_function.js new file mode 100644 index 00000000..fc24ead6 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/sqrt_function.js @@ -0,0 +1,27 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sqrt_function_modular] +const googleplex = { latitude: 37.4221, longitude: 122.0853 }; +const result = await db.pipeline() + .collection("cities") + .addFields( + field("lat").subtract(constant(googleplex.latitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("latitudeDifference"), + field("lng").subtract(constant(googleplex.longitude)) + .multiply(111 /* km per degree */) + .pow(2) + .as("longitudeDifference") + ) + .select( + field("latitudeDifference").add(field("longitudeDifference")).sqrt() + // Inaccurate for large distances or close to poles + .as("approximateDistanceToGoogle") + ) + .execute(); +// [END sqrt_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/starts_with.js b/snippets/firestore-temp/test-firestore/starts_with.js new file mode 100644 index 00000000..8cbfb6de --- /dev/null +++ b/snippets/firestore-temp/test-firestore/starts_with.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START starts_with_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("title").startsWith("The") + .as("needsSpecialAlphabeticalSort") + ) + .execute(); +// [END starts_with_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/str_concat.js b/snippets/firestore-temp/test-firestore/str_concat.js new file mode 100644 index 00000000..6386fef2 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/str_concat.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START str_concat_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("title").stringConcat(" by ", field("author")) + .as("fullyQualifiedTitle") + ) + .execute(); +// [END str_concat_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/str_reverse.js b/snippets/firestore-temp/test-firestore/str_reverse.js new file mode 100644 index 00000000..60b50ffc --- /dev/null +++ b/snippets/firestore-temp/test-firestore/str_reverse.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START str_reverse_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("name").reverse().as("reversedName") + ) + .execute(); +// [END str_reverse_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/string_contains.js b/snippets/firestore-temp/test-firestore/string_contains.js new file mode 100644 index 00000000..a785fc74 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/string_contains.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START string_contains_modular] +const result = await db.pipeline() + .collection("articles") + .select( + field("body").stringContains("Firestore") + .as("isFirestoreRelated") + ) + .execute(); +// [END string_contains_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/substr_function.js b/snippets/firestore-temp/test-firestore/substr_function.js new file mode 100644 index 00000000..051f2dbb --- /dev/null +++ b/snippets/firestore-temp/test-firestore/substr_function.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START substr_function_modular] +const result = await db.pipeline() + .collection("books") + .where(field("title").startsWith("The ")) + .select( + field("title").substring(4) + .as("titleWithoutLeadingThe") + ) + .execute(); +// [END substr_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/subtract_function.js b/snippets/firestore-temp/test-firestore/subtract_function.js new file mode 100644 index 00000000..e350cdd0 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/subtract_function.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START subtract_function_modular] +const storeCredit = 7; +const result = await db.pipeline() + .collection("books") + .select(field("price").subtract(constant(storeCredit)).as("totalCost")) + .execute(); +// [END subtract_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/sum_function.js b/snippets/firestore-temp/test-firestore/sum_function.js new file mode 100644 index 00000000..26c97bf0 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/sum_function.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START sum_function_modular] +const result = await db.pipeline() + .collection("cities") + .aggregate(field("population").sum().as("totalPopulation")) + .execute(); +// [END sum_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/timestamp_add.js b/snippets/firestore-temp/test-firestore/timestamp_add.js new file mode 100644 index 00000000..b0686a16 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/timestamp_add.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_add_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("createdAt").timestampAdd("day", 3653).as("expiresAt") + ) + .execute(); +// [END timestamp_add_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/timestamp_sub.js b/snippets/firestore-temp/test-firestore/timestamp_sub.js new file mode 100644 index 00000000..c62f6fb8 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/timestamp_sub.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_sub_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("expiresAt").timestampSubtract("day", 14).as("sendWarningTimestamp") + ) + .execute(); +// [END timestamp_sub_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/timestamp_unix_micros.js b/snippets/firestore-temp/test-firestore/timestamp_unix_micros.js new file mode 100644 index 00000000..e060f6ca --- /dev/null +++ b/snippets/firestore-temp/test-firestore/timestamp_unix_micros.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_unix_micros_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("dateString").timestampToUnixMicros().as("unixMicros") + ) + .execute(); +// [END timestamp_unix_micros_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/timestamp_unix_millis.js b/snippets/firestore-temp/test-firestore/timestamp_unix_millis.js new file mode 100644 index 00000000..690e5d8c --- /dev/null +++ b/snippets/firestore-temp/test-firestore/timestamp_unix_millis.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_unix_millis_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("dateString").timestampToUnixMillis().as("unixMillis") + ) + .execute(); +// [END timestamp_unix_millis_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/timestamp_unix_seconds.js b/snippets/firestore-temp/test-firestore/timestamp_unix_seconds.js new file mode 100644 index 00000000..a272cae5 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/timestamp_unix_seconds.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START timestamp_unix_seconds_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("dateString").timestampToUnixSeconds().as("unixSeconds") + ) + .execute(); +// [END timestamp_unix_seconds_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/to_lower.js b/snippets/firestore-temp/test-firestore/to_lower.js new file mode 100644 index 00000000..c40d0780 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/to_lower.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START to_lower_modular] +const result = await db.pipeline() + .collection("authors") + .select( + field("genre").toLower().equal("fantasy") + .as("isFantasy") + ) + .execute(); +// [END to_lower_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/to_upper.js b/snippets/firestore-temp/test-firestore/to_upper.js new file mode 100644 index 00000000..ec9b64d2 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/to_upper.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START to_upper_modular] +const result = await db.pipeline() + .collection("authors") + .select( + field("name").toUpper() + .as("uppercaseName") + ) + .execute(); +// [END to_upper_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/trim_function.js b/snippets/firestore-temp/test-firestore/trim_function.js new file mode 100644 index 00000000..c0bf58da --- /dev/null +++ b/snippets/firestore-temp/test-firestore/trim_function.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START trim_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("name").trim().as("whitespaceTrimmedName") + ) + .execute(); +// [END trim_function_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/union_stage.js b/snippets/firestore-temp/test-firestore/union_stage.js new file mode 100644 index 00000000..67637868 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/union_stage.js @@ -0,0 +1,17 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START union_stage_modular] +const results = await db.pipeline() + .collection("cities/SF/restaurants") + .where(field("type").equal("Chinese")) + .union(db.pipeline() + .collection("cities/NY/restaurants") + .where(field("type").equal("Italian"))) + .where(field("rating").greaterThanOrEqual(4.5)) + .sort(field("__name__").descending()) + .execute(); +// [END union_stage_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/unix_micros_timestamp.js b/snippets/firestore-temp/test-firestore/unix_micros_timestamp.js new file mode 100644 index 00000000..fefc3c1f --- /dev/null +++ b/snippets/firestore-temp/test-firestore/unix_micros_timestamp.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unix_micros_timestamp_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("createdAtMicros").unixMicrosToTimestamp().as("createdAtString") + ) + .execute(); +// [END unix_micros_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/unix_millis_timestamp.js b/snippets/firestore-temp/test-firestore/unix_millis_timestamp.js new file mode 100644 index 00000000..ed5f260f --- /dev/null +++ b/snippets/firestore-temp/test-firestore/unix_millis_timestamp.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unix_millis_timestamp_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("createdAtMillis").unixMillisToTimestamp().as("createdAtString") + ) + .execute(); +// [END unix_millis_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/unix_seconds_timestamp.js b/snippets/firestore-temp/test-firestore/unix_seconds_timestamp.js new file mode 100644 index 00000000..a5b8a674 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/unix_seconds_timestamp.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unix_seconds_timestamp_modular] +const result = await db.pipeline() + .collection("documents") + .select( + field("createdAtSeconds").unixSecondsToTimestamp().as("createdAtString") + ) + .execute(); +// [END unix_seconds_timestamp_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/unnest_edge_cases.js b/snippets/firestore-temp/test-firestore/unnest_edge_cases.js new file mode 100644 index 00000000..383acb3e --- /dev/null +++ b/snippets/firestore-temp/test-firestore/unnest_edge_cases.js @@ -0,0 +1,21 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unnest_edge_cases_modular] +// Input +// { identifier : 1, neighbors: [ "Alice", "Cathy" ] } +// { identifier : 2, neighbors: [] } +// { identifier : 3, neighbors: "Bob" } +const results = await db.pipeline() + .database() + .unnest(field("neighbors").as("unnestedNeighbors"), "index" ) + .execute(); + +// Output +// { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Alice", index: 0 } +// { identifier: 1, neighbors: [ "Alice", "Cathy" ], unnestedNeighbors: "Cathy", index: 1 } +// { identifier: 3, neighbors: "Bob", index: null} +// [END unnest_edge_cases_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/unnest_stage.js b/snippets/firestore-temp/test-firestore/unnest_stage.js new file mode 100644 index 00000000..58390262 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/unnest_stage.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START unnest_stage_modular] +const results = await db.pipeline() + .database() + .unnest(field("arrayField").as("unnestedArrayField"), "index") + .execute(); +// [END unnest_stage_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/vector_length.js b/snippets/firestore-temp/test-firestore/vector_length.js new file mode 100644 index 00000000..6cf36022 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/vector_length.js @@ -0,0 +1,14 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START vector_length_modular] +const result = await db.pipeline() + .collection("books") + .select( + field("embedding").vectorLength().as("vectorLength") + ) + .execute(); +// [END vector_length_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/xor_function.js b/snippets/firestore-temp/test-firestore/xor_function.js new file mode 100644 index 00000000..0c5906f3 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/xor_function.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START xor_function_modular] +const result = await db.pipeline() + .collection("books") + .select( + xor(field("tags").arrayContains("magic"), field("tags").arrayContains("nonfiction")) + .as("matchesSearchFilters") + ) + .execute(); +// [END xor_function_modular] \ No newline at end of file From dcc9a568228bc977dbcda24dbef91e5c02de2b28 Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Fri, 7 Nov 2025 13:58:27 -0800 Subject: [PATCH 18/19] add example snippet for web and nodejs --- firestore-next/test.firestore.js | 17 ++++++++++++++++- firestore-temp/test.firestore.js | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/firestore-next/test.firestore.js b/firestore-next/test.firestore.js index 60ce1eb0..8612ba91 100644 --- a/firestore-next/test.firestore.js +++ b/firestore-next/test.firestore.js @@ -1327,13 +1327,14 @@ describe("firestore", () => { describe("firestore-pipelines", () => { const { Firestore, + Timestamp, collection, doc, getFirestore, orderBy, query, setDoc, - startAt + startAt, } = require("firebase/firestore") const { Pipeline, @@ -1362,6 +1363,20 @@ describe("firestore-pipelines", () => { db = getFirestore(app, "enterprise"); }); + async function stagesExpressionsExample() { + // [START stages_expressions_example] + const trailing30Days = constant(Timestamp.now().toMillis()) + .unixMillisToTimestamp() + .timestampSubtract("day", 30); + const snapshot = await execute(db.pipeline() + .collection("productViews") + .where(field("viewedAt").greaterThan(trailing30Days)) + .aggregate(field("productId").countDistinct().as("uniqueProductViews")) + ); + // [END stages_expressions_example] + console.log(snapshot); + } + async function basicRead() { // [START basic_read] const readDataPipeline = db.pipeline() diff --git a/firestore-temp/test.firestore.js b/firestore-temp/test.firestore.js index bd27da8f..19b7bffb 100644 --- a/firestore-temp/test.firestore.js +++ b/firestore-temp/test.firestore.js @@ -5,7 +5,8 @@ const { expect } = require('chai'); describe("firestore-pipelines", () => { const { - Firestore + Firestore, + Timestamp } = require("@google-cloud/firestore") const { Pipeline, @@ -31,6 +32,20 @@ describe("firestore-pipelines", () => { }); }); + async function stagesExpressionsExample() { + // [START stages_expressions_example] + const trailing30Days = constant(Timestamp.now().toMillis()) + .unixMillisToTimestamp() + .timestampSubtract("day", 30); + const snapshot = await db.pipeline() + .collection("productViews") + .where(field("viewedAt").greaterThan(trailing30Days)) + .aggregate(field("productId").countDistinct().as("uniqueProductViews")) + .execute(); + // [END stages_expressions_example] + console.log(snapshot); + } + async function basicRead() { // [START basic_read] const readDataPipeline = db.pipeline() From 496a4268b03faa27b4d13bd036158be807bce32a Mon Sep 17 00:00:00 2001 From: Morgan Chen Date: Fri, 7 Nov 2025 13:59:22 -0800 Subject: [PATCH 19/19] run snippets --- .../test-firestore/stages_expressions_example.js | 16 ++++++++++++++++ .../test-firestore/stages_expressions_example.js | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 snippets/firestore-next/test-firestore/stages_expressions_example.js create mode 100644 snippets/firestore-temp/test-firestore/stages_expressions_example.js diff --git a/snippets/firestore-next/test-firestore/stages_expressions_example.js b/snippets/firestore-next/test-firestore/stages_expressions_example.js new file mode 100644 index 00000000..ad5a259c --- /dev/null +++ b/snippets/firestore-next/test-firestore/stages_expressions_example.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-next/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START stages_expressions_example_modular] +const trailing30Days = constant(Timestamp.now().toMillis()) + .unixMillisToTimestamp() + .timestampSubtract("day", 30); +const snapshot = await execute(db.pipeline() + .collection("productViews") + .where(field("viewedAt").greaterThan(trailing30Days)) + .aggregate(field("productId").countDistinct().as("uniqueProductViews")) +); +// [END stages_expressions_example_modular] \ No newline at end of file diff --git a/snippets/firestore-temp/test-firestore/stages_expressions_example.js b/snippets/firestore-temp/test-firestore/stages_expressions_example.js new file mode 100644 index 00000000..43e923c0 --- /dev/null +++ b/snippets/firestore-temp/test-firestore/stages_expressions_example.js @@ -0,0 +1,16 @@ +// This snippet file was generated by processing the source file: +// ./firestore-temp/test.firestore.js +// +// To update the snippets in this file, edit the source and then run +// 'npm run snippets'. + +// [START stages_expressions_example_modular] +const trailing30Days = constant(Timestamp.now().toMillis()) + .unixMillisToTimestamp() + .timestampSubtract("day", 30); +const snapshot = await db.pipeline() + .collection("productViews") + .where(field("viewedAt").greaterThan(trailing30Days)) + .aggregate(field("productId").countDistinct().as("uniqueProductViews")) + .execute(); +// [END stages_expressions_example_modular] \ No newline at end of file