Estoy usando la agregación Mongoose (MongoDB versión 3.2).
Tengo un campo de users que es una matriz. Quiero $project el primer elemento de esta matriz a un nuevo user de campo.
Lo intenté
{ $project: { user: '$users[0]', otherField: 1 }}, { $project: { user: '$users.0', otherField: 1 }}, { $project: { user: { $first: '$users'}, otherField: 1 }},Pero tampoco funciona.
¿Cómo puedo hacerlo correctamente? Gracias
Actualizar:
A partir de v4.4 hay un operador dedicado $primero :
{ $project: { user: { $first: "$users" }, otherField: 1 }},Es un azúcar de sintaxis para el
Respuesta original:
Puedes usar arrayElemAt :
{ $project: { user: { $arrayElemAt: [ "$users", 0 ] }, otherField: 1 }},Si se trata de una matriz de objetos y desea utilizar un solo campo de objeto, es decir:
{ "users": [ {name: "John", surname: "Smith"}, {name: "Elon", surname: "Gates"} ] }puedes usar:
{ $project: { user: { $first: "$users.name" } }Editar (excluir caso - después del comentario de @haytham)
Para excluir un solo campo de un documento anidado en una matriz, debe realizar 2 proyecciones:
{ $project: { user: { $first: "$users" } }Que devuelven el primer objeto completo y luego excluyen el campo que no desea, es decir:
{ $project: { "user.name" : 0 }A partir de Mongo 4.4 , el operador de agregación $first se puede usar para acceder al primer elemento de una matriz:
// { "users": ["Jean", "Paul", "Jack"] } // { "users": ["Claude"] } db.collection.aggregate([ { $project: { user: { $first: "$users" } } } ]) // { "user" : "Jean" } // { "user" : "Claude" }