Deskripsi
Membuat dokumen baru, baik dengan mereferensikan subkumpulan kolom yang ada maupun dengan menetapkan kolom ke hasil dari ekspresi tertentu.
Sintaksis
Node.js
const names = await db.pipeline()
.collection("/cities")
.select(stringConcat(field("name"), ", ", field("location.country")).as("name"), "population")
.execute();
Contoh klien
Web
const result = await execute(db.pipeline() .collection("books") .select(field("soldBooks").multiply(field("price")).round().as("partialRevenue")) .aggregate(field("partialRevenue").sum().as("totalRevenue")) );
Swift
let result = try await db.pipeline() .collection("books") .select([Field("soldBooks").multiply(Field("price")).round().as("partialRevenue")]) .aggregate([Field("partialRevenue").sum().as("totalRevenue")]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select(Expression.multiply(field("soldBooks"), field("price")).round().alias("partialRevenue")) .aggregate(AggregateFunction.sum("partialRevenue").alias("totalRevenue")) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select(Expression.multiply(field("soldBooks"), field("price")).round().alias("partialRevenue")) .aggregate(AggregateFunction.sum("partialRevenue").alias("totalRevenue")) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select( Field.of("soldBooks") .multiply(Field.of("price")) .round() .as_("partialRevenue") ) .aggregate(Field.of("partialRevenue").sum().as_("totalRevenue")) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select(round(multiply(field("soldBooks"), field("price"))).as("partialRevenue")) .aggregate(sum("partialRevenue").as("totalRevenue")) .execute() .get();
Perilaku
Posisi Tahap Select
Tidak ada batasan kapan tahap select dapat digunakan, tetapi kolom apa pun yang tidak disertakan dalam tahap select tidak akan dapat diakses oleh tahap berikutnya dalam pipeline.
Misalnya, untuk memilih hanya kolom name dan location dari semua kota di Kanada dari set data berikut:
Node.js
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, location: {country: 'Canada', province: 'Ontario'}});
Pipeline berikut dapat digunakan:
Node.js
const names = await db.pipeline()
.collection("/cities")
.where(equal(field("location.country"), "Canada"))
.select(stringConcat(field("name"), ", ", field("location.country")).as("name"), "population")
.execute();
Yang menghasilkan dokumen berikut:
{name: 'Toronto, Canada', population: 3000000},
Namun, jika tahap select ditempatkan sebelum tahap where, seperti:
Node.js
const names = await db.pipeline()
.collection("/cities")
.select(stringConcat(field("name"), ",", field("location.country")).as("name"), "population")
.where(equal(field("location.country"), "Canada"))
.execute();
Tidak ada dokumen yang akan dihasilkan karena location.country telah dihapus dari dokumen sebelum eksekusi tahap where.
Memilih Kolom Bertingkat
Tahap Select dapat digunakan untuk memilih kolom bertingkat dari peta dan array.
Misalnya, untuk memilih kolom country bertingkat dan entri pertama array landmarks dari dokumen berikut:
Node.js
await db.collection('cities').doc('SF').set({name: 'San Francisco', population: 800000, location: {country: 'USA', state: 'California'}, landmarks: ['Golden Gate Bridge', 'Alcatraz']});
await db.collection('cities').doc('TO').set({name: 'Toronto', population: 3000000, province: 'ON', location: {country: 'Canada', province: 'Ontario'}, landmarks: ['CN Tower', 'Casa Loma']});
await db.collection('cities').doc('AT').set({name: 'Atlantis', population: null});
Pipeline berikut dapat digunakan:
Node.js
const locations = await db.pipeline()
.collection("/cities")
.select(field("name").as("city"), field("location.country").as("country"), field("landmarks").arrayGet(0).as("topLandmark"))
.execute();
Yang menghasilkan dokumen berikut:
{city: 'San Francisco', country: 'USA', topLandmark: 'Golden Gate Bridge'},
{city: 'Toronto', country: 'Canada', topLandmark: 'CN Tower'},
{city: 'Atlantis'}
Jika nilai array atau nilai peta bertingkat tidak ada, nilai tersebut tidak disertakan dalam dokumen yang dihasilkan. Akses peta dan array di tahap select berperilaku identik dengan fungsi map_get dan array_get berturut-turut.