Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

การใช้งาน MongoDB Aggregate: $unwind, $group และ $project

$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 ของเอกสารต้นทาง: