Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Sắp xếp theo độ dài mảng trong MongoDB Aggregation

Để sắp xếp tài liệu theo độ dài của trường mảng, sử dụng aggregation pipeline: $unwind để phân tách mảng, $group với $sum để đếm, sau đó $sort.

Tạo collection:

> db.demo33.insertOne({"ListOfStudent":["Chris","Bob"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e17556ccfb11e5c34d898ca") }
> db.demo33.insertOne({"ListOfStudent":["David","Adam","Mike"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e17557acfb11e5c34d898cb") }
> db.demo33.insertOne({"ListOfStudent":["Carol","Sam","John","Robert"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e1755a3cfb11e5c34d898cc") }

Xem dữ liệu:

> 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 sắp xếp theo độ dài mảng giảm dần:

> db.demo33.aggregate({$unwind:"$ListOfStudent"}, { $group : {_id:'$_id', ct:{$sum:1}}}, { $sort :{ ct: -1}} );

Kết quả:

{ "_id" : ObjectId("5e1755a3cfb11e5c34d898cc"), "ct" : 4 }
{ "_id" : ObjectId("5e17557acfb11e5c34d898cb"), "ct" : 3 }
{ "_id" : ObjectId("5e17556ccfb11e5c34d898ca"), "ct" : 2 }

Cách hiện đại hơn (MongoDB 3.6+): Sử dụng $size trong $project rồi $sort - hiệu quả hơn vì không cần unwind:

db.demo33.aggregate([
  { $project: { ListOfStudent: 1, len: { $size: "$ListOfStudent" } } },
  { $sort: { len: -1 } }
])