説明
既存のフィールドのサブセットを参照するか、指定された式の結果にフィールドを割り当てることで、新しいドキュメントを生成します。
構文
Node.js
const names = await db.pipeline()
.collection("/cities")
.select(stringConcat(field("name"), ", ", field("location.country")).as("name"), "population")
.execute();
クライアントの例
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();
動作
選択ステージの位置
選択ステージの使用時期に制限はありませんが、選択ステージに含まれていないフィールドは、パイプラインの後続のステージでアクセスできません。
たとえば、次のデータセットからカナダのすべての都市の name フィールドと location フィールドのみを選択するには:
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'}});
次のパイプラインを使用できます。
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();
次のドキュメントが生成されます。
{name: 'Toronto, Canada', population: 3000000},
ただし、次のように select ステージが where ステージの前に配置されている場合:
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 ステージの実行前に location.country がドキュメントから削除されたため、ドキュメントは生成されません。
ネストされたフィールドを選択する
選択ステージを使用すると、マップと配列の両方からネストされたフィールドを選択できます。
たとえば、次のドキュメントからネストされた country フィールドと landmarks 配列の最初のエントリを選択するには、次のようにします。
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});
次のパイプラインを使用できます。
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();
次のドキュメントが生成されます。
{city: 'San Francisco', country: 'USA', topLandmark: 'Golden Gate Bridge'},
{city: 'Toronto', country: 'Canada', topLandmark: 'CN Tower'},
{city: 'Atlantis'}
ネストされたマップ値または配列値は、存在しない場合には、結果のドキュメントには含まれません。選択ステージでの配列およびマップのアクセスは、それぞれ array_get 関数および map_get 関数と同じように動作します。