MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come si accede a uno specifico elemento dell'array nell'aggregazione di proiezione MongoDB?

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" }
        }
    }
];