MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como você acessa um item de array específico na agregação de projeção do MongoDB?


O recurso que o ajudará a conseguir isso ainda não está disponível. No entanto, haverá um novo operador de agregação que fornece um elemento de matriz para um determinado índice. A nova expressão é chamada $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" }
        }
    }
];