Это можно сделать с помощью одного из запросов агрегации :
Запрос 1: Без использования $unwind
, с помощью $reduce
на массиве:
db.collection.aggregate([
{ $match: { area: "bath" } },
{
$addFields: {
ukresults: {
$let: {
vars: {
res: {
$reduce: {
input: "$ukresults",
initialValue: { votes: 0, party: {} },
in: {
votes: {
$cond: [
{ $gt: ["$$this.ukvotes", "$$value.votes"] },
"$$this.ukvotes",
"$$value.votes",
],
},
party: {
$cond: [
{ $gt: ["$$this.ukvotes", "$$value.votes"] },
"$$this",
"$$value.party",
],
},
},
},
},
},
in: "$$res.party",
},
},
},
},
]);
Тест: MongoDB-Playground
Запрос 2: С использованием $unwind
:
db.collection.aggregate([
{
$match: {
area: "bath"
}
},
{
$unwind: {
path: "$ukresults",
preserveNullAndEmptyArrays: true
}
},
{
$sort: {
"ukresults.ukvotes": -1
}
},
{
$limit: 1
}
])
Тест: MongoDB-Playground
Я бы сказал, что эти два могут работать хорошо, в основном мы работаем с одним документом (Потому что у нас $match
в качестве первого этапа), возможно, для первого запроса может потребоваться хитрость для итерации, если у вас больше элементов в массиве, попробуйте и выберите тот, который больше всего помогает.
Ref: Проверьте этот документ Pymon go для примеров агрегации: Pymon go -aggregation .