sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo accede a un elemento de matriz específico en la agregación de proyección de MongoDB?

La característica que lo ayudará a lograr esto aún no está disponible. Sin embargo, habrá un nuevo operador de agregación que proporcione un elemento de matriz para un índice determinado. La nueva expresión se llama $arrayElemAt

Use el nuevo operador de agregación que está disponible para las versiones de MongoDB 3.2.X y mayor, esto devuelve un elemento de matriz para un índice dado. La nueva expresión se llama $arrayElemAt . Toma dos argumentos, una matriz y un índice y devuelve el elemento en el índice dado en la matriz. Los índices negativos se aceptan como índices de la parte posterior de la matriz. Si el índice está fuera de los límites, devuelve el valor faltante, lo que significa que el campo no existirá en la salida:

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

Como solución por ahora (suponiendo que la matriz de coordenadas siempre tendrá dos elementos en un momento dado), puede probar la siguiente canalización de agregación que aprovechará el $first y $last agrupar operadores acumuladores para obtener los elementos después de 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" }
        }
    }
];