ใช้ Aggregation Pipeline: $unwind แยกอาร์เรย์, $group นับจำนวนด้วย $sum, แล้ว $sort ตามจำนวน
ตัวอย่างข้อมูลทดสอบ
> db.demo33.insertOne({"ListOfStudent":["Chris","Bob"]});
> db.demo33.insertOne({"ListOfStudent":["David","Adam","Mike"]});
> db.demo33.insertOne({"ListOfStudent":["Carol","Sam","John","Robert"]});
แสดงข้อมูลทั้งหมด
> db.demo33.find();
{
"_id" : ObjectId("5e17556ccfb11e5c34d898ca"),
"ListOfStudent" : [ "Chris", "Bob" ]
}
{
"_id" : ObjectId("5e17557acfb11e5c34d898cb"),
"ListOfStudent" : [ "David", "Adam", "Mike" ]
}
{
"_id" : ObjectId("5e1755a3cfb11e5c34d898cc"),
"ListOfStudent" : [ "Carol", "Sam", "John", "Robert" ]
}
คำสั่ง Aggregation จัดเรียงตามความยาวอาร์เรย์ (มากไปน้อย)
> db.demo33.aggregate(
{$unwind:"$ListOfStudent"},
{ $group : {_id:'$_id', ct:{$sum:1}}},
{ $sort :{ ct: -1}}
);
ผลลัพธ์
{
"_id" : ObjectId("5e1755a3cfb11e5c34d898cc"), "ct" : 4
}
{
"_id" : ObjectId("5e17557acfb11e5c34d898cb"), "ct" : 3
}
{
"_id" : ObjectId("5e17556ccfb11e5c34d898ca"), "ct" : 2
}
วิธีทางเลือก (MongoDB 3.4+): ใช้ $size ใน $project โดยไม่ต้อง $unwind:
db.demo33.aggregate([
{$project: {_id:1, ListOfStudent:1, len:{$size:"$ListOfStudent"}}},
{$sort: {len:-1}}
])