Найти и вывести максимальный элемент из коллекции MongoDB
[
{
_id: ObjectId("63ce4976d52b8e0552f39645"),
name: 'Спартак',
competition: {
date: '15.01.2023',
matches: [
{
number: 1,
name: 'Спартак-Динамо',
players: [
{ fio: 'Потапов К.С.', goalcount: 0 },
{ fio: 'Бочаров М.П.', goalcount: 1 },
{ fio: 'Петров А.И.', goalcount: 0 },
{ fio: 'Сергеев К.О.', goalcount: 2 },
{ fio: 'Любимов И.А.', goalcount: 0 }
]
},
{
number: 2,
name: 'Спартак-Урал',
players: [
{ fio: 'Потапов К.С.', goalcount: 1 },
{ fio: 'Бочаров М.П.', goalcount: 0 },
{ fio: 'Петров А.И.', goalcount: 1 },
{ fio: 'Сергеев К.О.', goalcount: 0 },
{ fio: 'Ковалёв М.А.', goalcount: 2 }
]
}
]
}
},
{
_id: ObjectId("63ce4976d52b8e0552f39646"),
name: 'Рубин',
competition: {
date: '10.01.2023',
matches: [
{
number: 1,
name: 'Рубин-Ростов',
players: [
{ fio: 'Бородаев И.С.', goalcount: 0 },
{ fio: 'Шевчук М.А.', goalcount: 3 },
{ fio: 'Бродский К.И.', goalcount: 0 },
{ fio: 'Потапов К.И.', goalcount: 0 },
{ fio: 'Михайлов Г.А.', goalcount: 1 }
]
},
{
number: 2,
name: 'Рубин-Краснодар',
players: [
{ fio: 'Бородаев И.С.', goalcount: 0 },
{ fio: 'Шевчук М.А.', goalcount: 1 },
{ fio: 'Громилов А.П.', goalcount: 4 },
{ fio: 'Потапов К.И.', goalcount: 0 },
{ fio: 'Михайлов Г.А', goalcount: 0 }
]
}
]
}
}
]
Как мне вывести футболиста, забившего больше всего голов(goalcount)?
Ответы (1 шт):
Вы можете вывести следующим образом
const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("collection").aggregate([
{$unwind:"$competition.matches.players"},
{$sort: {"competition.matches.players.goalcount": -1}},
{$limit:1},
{$project: {fio: "$competition.matches.players.fio", goalcount: "$competition.matches.players.goalcount"}}
]).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
Еще можете использовать код агрегации MongoDB, чтобы найти максимальное количество голов и соответствующего игрока. Это сделает следующий код:
db.collection.aggregate([
{$unwind:"$competition.matches.players"},
{$sort: {"competition.matches.players.goalcount": -1}},
{$limit:1},
{$project: {fio: "$competition.matches.players.fio", goalcount:
"$competition.matches.players.goalcount"}}
])
Сначала раскручивает массив «игроков», чтобы каждый игрок находился в отдельном документе. Затем сортируется документы по количеству голов в порядке убывания, ограничивает результат первым документом и проецирует окончательный вывод так, чтобы он включал только поля fio и число голов. Результатом станет игрок с наибольшим количеством голов. Затем вы можете использовать драйвер MongoDB для JavaScript, чтобы запросить вашу коллекцию MongoDB и выполнить этот конвейер, чтобы найти игрока с наибольшим количеством голов. Вы также можете изменить поля на этапе проекта в соответствии с вашими требованиями.