Project first item in an array to new field (MongoDB aggregation) Project first item in an array to new field (MongoDB aggregation) mongoose mongoose

Project first item in an array to new field (MongoDB aggregation)


Update:

Starting from v4.4 there is a dedicated operator $first:

{ $project: {    user: { $first: "$users" },    otherField: 1}},

It's a syntax sugar to the

Original answer:

You can use arrayElemAt:

{ $project: {    user: { $arrayElemAt: [ "$users", 0 ] },    otherField: 1}},


Starting Mongo 4.4, the aggregation operator $first can be used to access the first element of an array:

// { "users": ["Jean", "Paul", "Jack"] }// { "users": ["Claude"] }db.collection.aggregate([  { $project: { user: { $first: "$users" } } }])// { "user" : "Jean" }// { "user" : "Claude" }


If it is an array of objects and you want to use just single object field, ie:

{ "users": [    {name: "John", surname: "Smith"},    {name: "Elon", surname: "Gates"}   ]}

you can use:

{ $project: { user: { $first: "$users.name" } } 

Edit (exclude case - after comment from @haytham)

In order to exclude a single field from a nested document in array you have to do 2 projections:

 { $project: { user: { $first: "$users" } } 

Which return whole first object, and then exclude field you do not want, ie:

{ $project: { "user.name" : 0 }