說明
subcollection(...) 輸入階段可讓您使用內建的 __name__ 欄位,輕鬆執行父項子項聯結。
您可以將其他階段鏈結至 subcollection(...) 階段,對巢狀文件執行篩選或匯總作業。請注意,後續階段中使用的任何欄位參照,都是指巢狀集合中的文件,而非父項文件。如要參照父項範圍中的欄位,請先使用 let(...) 階段定義變數,然後在本地範圍中參照這些變數。
範例
Node.js
db.pipeline()
.collection("/restaurants")
.add_fields(subcollection("reviews")
.aggregate(average("rating").as("avg_rating"))
.toScalarExpression()
.as("avg_rating"))
行為
subcollection(...) 階段必須在子查詢的內容中使用。系統會使用父項範圍中目前文件的 __name__ (文件參照),判斷要擷取的子集合。舉例來說,如果父項文件是 /restaurants/pizza-place,則 subcollection("reviews") 會傳回 /restaurants/pizza-place/reviews 集合中的所有文件。
如果文件參照已重新命名,或無法使用 __name__ 定義欄位,請手動撰寫聯結,例如:
Node.js
db.pipeline()
.collection("/restaurants")
.let(field("__name__").as("restaurant_name"))
.add_fields(db.pipeline()
.collectionGroup("reviews")
.where(field("__name__").parent().equals(variable("restaurant_name")))
.aggregate(average("rating").as("avg_rating"))
.toScalarExpression()
.as("avg_rating"))
仍有可能,因為從根本上來說,這個階段只是這個更複雜的聯結格式的語法糖。
適用於下列文件:
Node.js
const restaurant1 = db.collection("restaurants").document("pizza-place");
const restaurant2 = db.collection("restaurants").document("urban-bite");
const restaurant3 = db.collection("restaurants").document("nacho-house");
await restaurant1.create({ name: "Pizza Place" });
await restaurant2.create({ name: "Urban Bite" });
await restaurant3.create({ name: "Nacho House" });
await restaurant1.collection("reviews").doc("1").create({ rating: 5 });
await restaurant1.collection("reviews").doc("1").create({ rating: 2 });
await restaurant2.collection("reviews").doc("1").create({ rating: 3 });
await restaurant2.collection("reviews").doc("1").create({ rating: 4 });
await restaurant2.collection("reviews").doc("1").create({ rating: 5 });
下列查詢會擷取每間餐廳,並在新 review_summary 欄位中摘要顯示評論:
Node.js
const results = await db.pipeline()
.collectionGroup("restaurants")
.add_fields(subcollection("reviews")
.aggregate(
countAll().as("review_count"),
average("rating").as("avg_rating"))
.asScalarExpression()
.as("review_summary"))
.execute();
並產生下列結果:
{ name: "Pizza Place", review_summary: { review_count: 2, avg_rating: 3.5 } },
{ name: "Urban Bite", review_summary: { review_count: 3, avg_rating: 4.0 } },
{ name: "Nacho House", review_summary: { review_count: 0, avg_rating: null } },