MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment accéder à un élément de tableau spécifique dans l'agrégation de projection MongoDB ?

La fonctionnalité qui vous aidera à atteindre cet objectif n'est pas encore disponible. Cependant, il y aura un nouvel opérateur d'agrégation qui donnera un élément de tableau pour un index donné. La nouvelle expression s'appelle $arrayElemAt

Utilisez le nouvel opérateur d'agrégation disponible pour les versions de MongoDB 3.2.X et plus, cela renvoie un élément de tableau pour un index donné. La nouvelle expression s'appelle $arrayElemAt . Il prend deux arguments, un tableau et un index et renvoie l'élément à l'index donné dans le tableau. Les indices négatifs sont acceptés en tant qu'indices à l'arrière du tableau. Si l'index est hors limites, il renvoie la valeur manquante, ce qui signifie que le champ n'existera pas dans la sortie :

var pipeline = [    
    { $match : {"geo" : {$ne: null}}},
    {
        $project: {
            _id: "$id_str", 
            lat: { $arrayElemAt: ['$geo.coordinates', 0] },
            lon: { $arrayElemAt: ['$geo.coordinates', 1] }
        }
    }
];

Comme solution de contournement pour l'instant (en supposant que le tableau de coordonnées aura toujours deux éléments à un moment donné), vous pouvez essayer le pipeline d'agrégation suivant qui tirera parti du $first et $last regrouper les opérateurs d'accumulateur pour obtenir les éléments après 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" }
        }
    }
];