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

จัดเรียงตามความยาวอาร์เรย์ด้วย MongoDB Aggregation

ใช้ 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}}
])