Группировку данных в MongoDB можно делать как по одному полю, так и по нескольким, превращая их во вложенный документ:
db.my_collection.aggregate([ {$group: { _id: {surname: "$surname", name: "$name"} }}, ]);
Этот запрос вернёт такой результат:
{_id: {name: "Аттикус", surname: "Финч"}} {_id: {name: "Индиана", surname: "Джонс"}} {_id: {name: "Джеймс", surname: "Бонд"}} {_id: {name: "Рик", surname: "Блейн"}} {_id: {name: "Уилл", surname: "Кейн"}}
А вложенные документы поднять на уровень выше, нужна проекция:
db.my_collection.aggregate([ {$group: { _id: {surname: "$surname", name: "$name"} }}, {$project: {_id: 0, surname: "$_id.surname", name: "$_id.name"}}, {$sort: {surname: 1, name: 1}} ]);
Этот запрос вернёт данные в таком виде:
{name: "Рик", surname: "Блейн"} {name: "Джеймс", surname: "Бонд"} {name: "Индиана", surname: "Джонс"} {name: "Уилл", surname: "Кейн"} {name: "Аттикус", surname: "Финч"}