$arrayElemAt
Use o novo operador de agregação disponível para as versões do MongoDB
3.2.X
e maior, isso retorna um elemento de matriz para um determinado índice. A nova expressão é chamada $arrayElemAt
. Ele recebe dois argumentos, um array e um índice e retorna o elemento no índice fornecido no array. Índices negativos são aceitos como índices da parte de trás do array. Se o índice estiver fora dos limites, ele retornará o valor ausente, o que significa que o campo não existirá na saída:var pipeline = [
{ $match : {"geo" : {$ne: null}}},
{
$project: {
_id: "$id_str",
lat: { $arrayElemAt: ['$geo.coordinates', 0] },
lon: { $arrayElemAt: ['$geo.coordinates', 1] }
}
}
];
Como solução alternativa por enquanto (supondo que a matriz de coordenadas sempre terá dois elementos a qualquer momento), você pode tentar o seguinte pipeline de agregação que aproveitará o
$first
e $last
agrupe operadores de acumulador para obter os elementos após um $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" }
}
}
];