Açıklama
Mevcut alanların bir alt kümesine referans vererek veya belirli bir ifadenin sonucuna bir alan atayarak yeni dokümanlar oluşturur.
Örnekler
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();
Davranış
Seçme aşamasının konumu
Belirli bir seçim aşamasının ne zaman kullanılabileceği konusunda kısıtlama yoktur ancak bir seçim aşamasına dahil edilmeyen alanlara, bir ardışık düzendeki sonraki aşamalarda erişilemez. Örneğin, aşağıdaki veri kümesinden Kanada'daki tüm şehirlerin yalnızca name ve location alanlarını seçmek için:
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"}
});
Aşağıdaki ardışık düzen kullanılabilir:
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();
Bu işlem sonucunda aşağıdaki belgeler oluşturulur:
{ name: "Toronto, Canada", population: 3000000 },
Ancak select(...) aşaması where(...) aşamasından önce yerleştirilirse (örneğin):
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();
where(...) aşaması yürütülmeden önce location.country dokümandan kaldırıldığı için herhangi bir doküman oluşturulmayacak.
İç İçe Yerleştirilmiş Alanları Seçme
select(...) aşaması, hem haritalardan hem de dizilerden iç içe yerleştirilmiş alanları seçmek için kullanılabilir. Örneğin, aşağıdaki belgelerden iç içe yerleştirilmiş country alanını ve landmarks dizisinin ilk girişini seçmek için:
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
});
Aşağıdaki ardışık düzen kullanılabilir:
Node.js
const locations = await db.pipeline()
.collection("/cities")
.select(
field("name").as("city"),
field("location.country").as("country"),
field("landmarks").offset(0).as("topLandmark"))
.execute();
Bu işlem sonucunda aşağıdaki belgeler oluşturulur:
{ city: "San Francisco", country: "USA", topLandmark: "Golden Gate Bridge" },
{ city: "Toronto", country: "Canada", topLandmark: "CN Tower" },
{ city: "Atlantis" }
İç içe yerleştirilmiş bir harita değeri veya dizi değeri yoksa sonuçta elde edilen belgeye dahil edilmez. Seçme aşamasında dizi ve harita erişimi sırasıyla offset(...) ve get_field(...) işlevleriyle aynı şekilde çalışır.
İç İçe Yerleştirilmiş Alanları Atama
Bir ifadenin sonucu, iç içe yerleştirilmiş bir alana da atanabilir. Bu sayede select(...) aşamasının, önceki aşamadaki iç içe yerleştirilmiş alanların bir alt kümesini döndürmesi mümkün olur. Örneğin, aşağıdaki yöntemler, yalnızca city ve state bilgilerinin döndürülmesini sağlarken belgenin orijinal şeklini korumak için kullanılabilir:
Node.js
const results = await db.pipeline()
.collection("/users")
.addFields(
field("__name__"),
field("address.city").as("address.city"),
field("address.state").as("address.state"))
.execute();