หากต้องการจัดเรียงตามการจับคู่เอกสารย่อย คุณสามารถใช้กรอบงานรวมได้ ให้เราสร้างคอลเลกชันที่มีเอกสารก่อน -
> db.sortBySubDocumentsDemo.insertOne( { "StudentName": "Chris", "StudentDetails": [ { "Age":21, "StudentScore":91 }, { "Age":22, "StudentScore":99 }, { "Age":21, "StudentScore":93 } ] } ); { "acknowledged" : true, "insertedId" : ObjectId("5cd57e297924bb85b3f48942") } > db.sortBySubDocumentsDemo.insertOne( { "StudentName": "Robert", "StudentDetails": [ { "Age":24, "StudentScore":78 }, { "Age":21, "StudentScore":86 }, { "Age":23, "StudentScore":45 } ] } ); { "acknowledged" : true, "insertedId" : ObjectId("5cd57e4c7924bb85b3f48943") }
ต่อไปนี้เป็นแบบสอบถามเพื่อแสดงเอกสารทั้งหมดจากคอลเลกชันโดยใช้วิธี find() -
> db.sortBySubDocumentsDemo.find().pretty();
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
{ "_id" : ObjectId("5cd57e297924bb85b3f48942"), "StudentName" : "Chris", "StudentDetails" : [ { "Age" : 21, "StudentScore" : 91 }, { "Age" : 22, "StudentScore" : 99 }, { "Age" : 21, "StudentScore" : 93 } ] } { "_id" : ObjectId("5cd57e4c7924bb85b3f48943"), "StudentName" : "Robert", "StudentDetails" : [ { "Age" : 24, "StudentScore" : 78 }, { "Age" : 21, "StudentScore" : 86 }, { "Age" : 23, "StudentScore" : 45 } ] }
ต่อไปนี้เป็นแบบสอบถามเพื่อจัดเรียงตามเอกสารย่อยที่ตรงกัน เรากำลังจัดเรียงตาม StudentScore -
> db.sortBySubDocumentsDemo.aggregate([ {$match: { 'StudentDetails.Age': 21 }}, {$unwind: '$StudentDetails'}, {$match: {'StudentDetails.Age': 21}}, {$project: {_id: 0, "StudentName": 1, 'StudentDetails.StudentScore': 1}}, {$sort: { 'StudentDetails.StudentScore': 1 }}, {$limit: 5} ]);
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
{ "StudentName" : "Robert", "StudentDetails" : { "StudentScore" : 86 } } { "StudentName" : "Chris", "StudentDetails" : { "StudentScore" : 91 } } { "StudentName" : "Chris", "StudentDetails" : { "StudentScore" : 93 } }