Funktionen som hjälper dig att uppnå detta är inte tillgänglig ännu. Det kommer dock att finnas en ny aggregeringsoperator som ger ett arrayelement för ett givet index. Det nya uttrycket heter $arrayElemAt
Använd den nya aggregeringsoperatorn som är tillgänglig för MongoDB versioner 3.2.X
och högre, detta returnerar ett matriselement för ett givet index. Det nya uttrycket heter $arrayElemAt
. Det tar två argument, en array och ett index och returnerar elementet vid det givna indexet i arrayen. Negativa index accepteras som index från baksidan av arrayen. Om indexet är utanför gränserna returnerar det det saknade värdet, vilket betyder att fältet inte kommer att existera i utdata:
var pipeline = [
{ $match : {"geo" : {$ne: null}}},
{
$project: {
_id: "$id_str",
lat: { $arrayElemAt: ['$geo.coordinates', 0] },
lon: { $arrayElemAt: ['$geo.coordinates', 1] }
}
}
];
Som en lösning för tillfället (förutsatt att koordinatmatrisen alltid kommer att ha två element vid varje given tidpunkt), kan du prova följande aggregeringspipeline som kommer att dra fördel av $first
och $last
gruppera ackumulatoroperatorer för att hämta elementen 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" }
}
}
];