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