Den funktion, der hjælper dig med at opnå dette, er endnu ikke tilgængelig. Der vil dog være en ny aggregeringsoperator, der giver et array-element for et givet indeks. Det nye udtryk hedder $arrayElemAt
Brug den nye aggregeringsoperator, der er tilgængelig for MongoDB-versioner 3.2.X
og større returnerer dette et array-element for et givet indeks. Det nye udtryk hedder $arrayElemAt
. Det tager to argumenter, et array og et indeks og returnerer elementet ved det givne indeks i arrayet. Negative indekser accepteres som indekser fra bagsiden af arrayet. Hvis indekset er uden for grænserne, returnerer det den manglende værdi, hvilket betyder, at feltet ikke eksisterer i outputtet:
var pipeline = [
{ $match : {"geo" : {$ne: null}}},
{
$project: {
_id: "$id_str",
lat: { $arrayElemAt: ['$geo.coordinates', 0] },
lon: { $arrayElemAt: ['$geo.coordinates', 1] }
}
}
];
Som en løsning indtil videre (forudsat at koordinat-arrayet altid vil have to elementer på et givet tidspunkt), kan du prøve følgende aggregeringspipeline, som vil drage fordel af $first
og $last
gruppe akkumulatoroperatorer for at få elementerne efter en $sort
:
var pipeline = [
{$match : {"geo" : {$ne: null}}},
{ "$unwind": "$geo.coordinates" },
{ "$sort": {"geo.coordinates": 1} } ,
{
"$group": {
"_id": "$_id",
"lat": { "$first": "$geo.coordinates" },
"lon": { "$last": "$geo.coordinates" }
}
}
];