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

Sắp xếp và lấy 2 trường đầu trong phép $group MongoDB

Kết hợp $sort trước $group với $first để lấy tài liệu có giá trị nhỏ nhất/ lớn nhất mỗi nhóm. Tạo collection:

> db.demo576.insertOne({id:101,Name:"Chris",Marks:45})
{ "acknowledged" : true, "insertedId" : ObjectId("5e916c3b581e9acd78b427fa") }
> db.demo576.insertOne({id:101,Name:"John",Marks:55})
{ "acknowledged" : true, "insertedId" : ObjectId("5e916c43581e9acd78b427fb") }
> db.demo576.insertOne({id:101,Name:"John",Marks:65})
{ "acknowledged" : true, "insertedId" : ObjectId("5e916c47581e9acd78b427fc") }
> db.demo576.insertOne({id:102,Name:"David",Marks:37})
{ "acknowledged" : true, "insertedId" : ObjectId("5e916c55581e9acd78b427fd") }
> db.demo576.insertOne({id:102,Name:"David",Marks:75})
{ "acknowledged" : true, "insertedId" : ObjectId("5e916c5e581e9acd78b427fe") }

Hiển thị dữ liệu:

> db.demo576.find();
{ "_id" : ObjectId("5e916c3b581e9acd78b427fa"), "id" : 101, "Name" : "Chris", "Marks" : 45 }
{ "_id" : ObjectId("5e916c43581e9acd78b427fb"), "id" : 101, "Name" : "John", "Marks" : 55 }
{ "_id" : ObjectId("5e916c47581e9acd78b427fc"), "id" : 101, "Name" : "John", "Marks" : 65 }
{ "_id" : ObjectId("5e916c55581e9acd78b427fd"), "id" : 102, "Name" : "David", "Marks" : 37 }
{ "_id" : ObjectId("5e916c5e581e9acd78b427fe"), "id" : 102, "Name" : "David", "Marks" : 75 }

Pipeline: Sắp xếp Marks tăng dần → Nhóm theo id lấy tài liệu đầu ($first: $$ROOT) → Project trường cần thiết:

> var query = [
...   { "$sort": { "Marks": 1 } },
...   { "$group": { "_id": "$id", "out": { "$first": "$$ROOT" } } },
...   { "$project": { "_id": "$out._id", "id": "$out.id", "Name": "$out.Name", "MinMarks": "$out.Marks" } }
... ];
> db.demo576.aggregate(query);

Kết quả (điểm thấp nhất mỗi id):

{ "_id" : ObjectId("5e916c3b581e9acd78b427fa"), "id" : 101, "Name" : "Chris", "MinMarks" : 45 }
{ "_id" : ObjectId("5e916c55581e9acd78b427fd"), "id" : 102, "Name" : "David", "MinMarks" : 37 }

Kỹ thuật cốt lõi: $sort trước $group đảm bảo tài liệu đầu tiên trong mỗi nhóm là tài liệu có giá trị cực trị (min/max). $$ROOT tham chiếu toàn bộ tài liệu.