De functie waarmee u dit kunt bereiken, is nog niet beschikbaar. Er zal echter een nieuwe aggregatie-operator zijn die een array-element voor een bepaalde index geeft. De nieuwe expressie heet $arrayElemAt
Gebruik de nieuwe aggregatie-operator die beschikbaar is voor MongoDB-versies 3.2.X
en groter, dit retourneert een array-element voor een bepaalde index. De nieuwe uitdrukking heet $arrayElemAt
. Het heeft twee argumenten nodig, een array en een index, en retourneert het element met de gegeven index in de array. Negatieve indices worden geaccepteerd als indexen vanaf de achterkant van de array. Als de index buiten de grenzen valt, wordt de ontbrekende waarde geretourneerd, wat betekent dat het veld niet zal bestaan in de uitvoer:
var pipeline = [
{ $match : {"geo" : {$ne: null}}},
{
$project: {
_id: "$id_str",
lat: { $arrayElemAt: ['$geo.coordinates', 0] },
lon: { $arrayElemAt: ['$geo.coordinates', 1] }
}
}
];
Als tijdelijke oplossing (ervan uitgaande dat de coördinatenarray altijd twee elementen op een bepaald moment zal hebben), kunt u de volgende aggregatiepijplijn proberen die gebruik maakt van de $first
en $last
groep accumulator operators om de elementen te krijgen na een $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" }
}
}
];