คำอธิบาย
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 } },