La funzione che ti aiuterà a raggiungere questo obiettivo non è ancora disponibile. Tuttavia, ci sarà un nuovo operatore di aggregazione che fornisce un elemento di matrice per un determinato indice. La nuova espressione si chiama $arrayElemAt
Usa il nuovo operatore di aggregazione disponibile per le versioni di MongoDB 3.2.X
e maggiore, restituisce un elemento dell'array per un dato indice. La nuova espressione si chiama $arrayElemAt
. Prende due argomenti, un array e un indice e restituisce l'elemento in corrispondenza dell'indice specificato nell'array. Gli indici negativi sono accettati come indici dal retro dell'array. Se l'indice è fuori limite, restituisce il valore mancante, il che significa che il campo non esisterà nell'output:
var pipeline = [
{ $match : {"geo" : {$ne: null}}},
{
$project: {
_id: "$id_str",
lat: { $arrayElemAt: ['$geo.coordinates', 0] },
lon: { $arrayElemAt: ['$geo.coordinates', 1] }
}
}
];
Come soluzione alternativa per ora (supponendo che l'array di coordinate avrà sempre due elementi in un dato momento), potresti provare la seguente pipeline di aggregazione che sfrutterà il $first
e $last
operatori accumulatori di gruppo per ottenere gli elementi dopo un $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" }
}
}
];