es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo proyectar un elemento de matriz como un atributo en un documento?

Estoy tratando de proyectar dos elementos de un array que obtuve después de unir dos documentos usando $lookup. Cuando uso la notación de punto para acceder a los elementos del array como se muestra a continuación:


db.departments.aggregate([{
$lookup: {
from: 'employees',
localField: 'dep_id',
foreignField: 'department',
as: 'emps'
}
}, {
$project: {
_id: 0,
emp_id: 1,
salary: 1,
emp_name: '$emps.name',
username: '$emps.username'
}
}])

Obtengo el siguiente resultado:


emp_id: 910579
salary: 100000
emp_name: Array
0: "Stephen Wolf"
username: Array
0: "StepWolf"

Quiero el resultado de la siguiente manera:


emp_id: 910579
salary: 100000
emp_name: "Stephen Wolf"
username: "StepWolf"

¿Alguien tiene alguna sugerencia? Quiero algo que pueda convertir un elemento de un array en un atributo, similar a la función ObjectToArray.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puede usar el operador de agregación $arrayElemAt para proyectar un elemento específico de una matriz.

    En su caso, puede usarlo de la siguiente manera:

    db.departments.aggregate([{
        $lookup: {
            from: 'employees',
            localField: 'dep_id',
            foreignField: 'department',
            as: 'emps'
        }
    }, {
        $project: {
            _id: 0,
            emp_id: 1,
            salary: 1,
            emp_name: { $arrayElemAt: ['$emps.name', 0] },
            username: { $arrayElemAt: ['$emps.username', 0] }
        }
    }])
    

    Aquí, $arrayElemAt toma dos argumentos: la matriz de la que desea proyectar y el índice del elemento que desea proyectar. En este caso, estamos proyectando el primer elemento de las matrices name y username.

    Esto debería darle el resultado deseado:

    emp_id:910579
    salary:100000
    emp_name:"Stephen Wolf"
    username:"StepWolf"
    

Comments are closed.