$unwind ใน MongoDB ใช้สำหรับแยกฟิลด์อาร์เรย์จากเอกสารนำเข้า เพื่อสร้างเอกสารสำหรับแต่ละองค์ประกอบ
$group ใช้จัดกลุ่มเอกสารนำเข้าตามนิพจน์ _id ที่ระบุ และสร้างเอกสารสำหรับแต่ละกลุ่มที่แตกต่างกัน
$project ใช้ส่งเอกสารพร้อมฟิลด์ที่ร้องขอไปยังขั้นตอนถัดไปใน Pipeline
สร้างคอลเลกชันพร้อมเอกสาร:
> db.demo238.insertOne(
... {
... "EmailId" : "John@gmail.com",
... "details" : [
... { "Name" : "Bob", "isActive" : true }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : ObjectId("5e4418e3f4cebbeaebec5152") }
> db.demo238.insertOne(
... {
... "EmailId" : "Chris@gmail.com",
... "details" : [
... { "Name" : "David" }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : ObjectId("5e4418e3f4cebbeaebec5153") }
> db.demo238.insertOne(
... {
... "EmailId" : "Mike@gmail.com",
... "details" : [
... { "Name" : "Carol", "isActive" : true }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : ObjectId("5e4418e4f4cebbeaebec5154") }
แสดงเอกสารทั้งหมดด้วย find().pretty():
> db.demo238.find().pretty();
ผลลัพธ์:
คำสั่ง Aggregation ใช้ $match, $unwind, $match อีกครั้ง, และ $group:
> db.demo238.aggregate( ... [ ... { "$match": { "details.isActive": true } }, ... { "$unwind": "$details" }, ... { "$match": { "details.isActive": true } }, ... { "$group": { ... "_id": "$details.Name", ... "active": { "$first": "$_id" } ... }} ... ], ... function(err,result) { ... } ...);ผลลัพธ์ - ได้เฉพาะชื่อที่มี isActive = true พร้อม ObjectId ของเอกสารต้นทาง: