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

¿Cómo usar $arrayElemAt y eliminar campos de ese elemento en MongoDB $projection?

Esto es de la sintaxis de arrayElemAt

Lo que significa que puedes construir los elementos de tu matriz como quieras. En tu caso solo quieres el nombre. Así que esto debería funcionar:

[{
  $match: {
    jobCategoryId: mongoose.Types.ObjectId(jobCategoryId)
  }
}, {  
  $lookup: {  
    from: 'users',
    localField: 'userId',
    foreignField: '_id',
    as: 'user'
  }
}, {  
  $project: {  
    _id: 1,
    description: 1,
    title: 1,
    user: {  
      name: {
        $arrayElemAt: ["$user.name", 0]
      }
    }
  }
}]

Seguimiento ACTUALIZAR :se preguntó cómo añadir propiedades adicionales a name . Aquí está el proyecto:

{  
  $project: {  
    _id: 1,
    description: 1,
    title: 1,
    user: {  
      name: {  
        $arrayElemAt: ["$user.name", 0]
      },
      email: {  
        $arrayElemAt: ["$user.email", 0]
      }
    }
  }
}

Segundo seguimiento como Drag0 preguntó en los comentarios:si lo anterior no es lo suficientemente bueno porque los resultados generan un usuario:[] matriz de tamaño 1 en lugar de un objeto usuario:{} se puede usar lo siguiente.

{  
  $project: {
    _id: 1,
    description: 1,
    title: 1,
    user: {
      $let: {
        vars: {
          firstUser: {
            $arrayElemAt: ["$user", 0]
          }
        },
        in: {
          name: "$$firstUser.name",
          email: "$$firstUser.email"
        }
      }
    }
  }
}