Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$project (etapa de agregación)

$project

Pasa los documentos con los campos solicitados a la siguiente etapa del proceso. Los campos especificados pueden ser campos existentes en los documentos de entrada o campos nuevos calculados.

$project poder:

  • Incluir campos de los documentos de entrada.

  • Suprimir el campo _id.

  • Agregue nuevos campos o restablezca los valores de los campos existentes.

  • Excluir campos de los documentos de entrada.

Puedes usar $project para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

$project tiene la siguiente forma:

{ $project: { <specification(s)> } }

Las especificaciones $project tienen las siguientes formas:

formulario
Descripción

<field>: <1 or true>

Especifica la inclusión de un campo. Los enteros distintos de cero también se tratan como true.

_id: <0 or false>

Especifica la supresión del campo _id.

Para excluir un campo de forma condicional, utiliza la variable REMOVE en su lugar. Para obtener más información, consulta Excluye campos de forma condicional.

<field>: <expression>

Añade un nuevo campo o restablece el valor de un campo existente.

Si la expresión se evalúa como $$REMOVE, el campo se excluye en la salida. Para obtener más información, se puede consultar Excluir campos de forma condicional.

<field>: <0 or false>

Especifica la exclusión de un campo.

Para excluir un campo de forma condicional, utiliza la variable REMOVE en su lugar. Para obtener más información, consulta Excluye campos de forma condicional.

Si especifica la exclusión de un campo distinto de _id,no podrá utilizar ninguna otra especificación de $project. Esta restricción no se aplica a la exclusión condicional de un campo mediante la variable REMOVE.

Para excluir campos, también puedes utilizar la etapa $unset.

  • Por defecto, los documentos de salida incluyen el campo _id. Para incluir otros campos de los documentos de entrada, especifíquelos explícitamente en $project.

  • Si especifica la inclusión de un campo que no existe en el documento, $project ignora esa inclusión de campo y no agrega el campo al documento.

Por defecto, el campo _id se incluye en los documentos de salida. Para excluir el campo _id de los documentos de salida, debe suprimir explícitamente el campo _id en $project.

Si excluye un campo, todos los demás campos aparecerán en los documentos de salida.

{ $project: { "<field1>": 0, "<field2>": 0, ... } } // Return all but the specified fields

Si excluye un campo distinto de _id, no podrá utilizar otras formas de especificación $project. Si excluye campos, tampoco podrá especificar la inclusión de otros campos, restablecer el valor de los campos existentes ni añadir nuevos campos. Esta restricción no se aplica a la exclusión condicional de un campo mediante la variable REMOVE.

Para excluir campos, también puede usar $unset.

Puedes usar la variable REMOVE en expresiones de agregación para suprimir condicionalmente un campo. Para un ejemplo, ve Excluir campos condicionalmente.

Nota

MongoDB también proporciona $addFields para añadir nuevos campos a los documentos.

Para añadir un nuevo campo o restablecer el valor de uno existente, especifique el nombre del campo y asigne una expresión a su valor. Para obtener más información sobre las expresiones, consulte la sección Expresiones.

Para asignar a un campo un valor numérico o booleano en lugar de una expresión que se resuelva en un literal, utilice el operador $literal. De lo contrario, $project interpreta el literal como un indicador para incluir o excluir el campo.

Al especificar un nuevo campo y establecer el valor en la ruta de campo de un campo existente, se puede renombrar un campo de manera efectiva.

La etapa $project permite usar los corchetes [] para crear directamente nuevos campos de matriz. Si especifica campos de matriz que no existen en un documento, la operación sustituye null por el valor de dicho campo. Para ver un ejemplo, consulte la sección "Proyectar nuevos campos de matriz".

No puedes utilizar un índice de arreglo con la etapa $project.

Para proyectar, agregar o restablecer un campo dentro de un documento incrustado, puede utilizar la notación de puntos:

"contact.address.country": <1 or 0 or expression>

También puedes anidar los campos:

contact: { address: { country: <1 or 0 or expression> } }

Cuando se anidan campos,no se puede usar la notación de punto dentro del documento incrustado para especificar el campo. Por ejemplo, contact: { "address.country": <1 or 0 or expression> } no es válido.

No puede especificar tanto un documento incrustado como un campo dentro de ese documento incrustado en la misma proyección.

La siguiente etapa $project falla con un error Path collision porque intenta proyectar tanto el documento contact incrustado como el campo contact.address.country:

{ $project: { contact: 1, "contact.address.country": 1 } }

El error se produce independientemente del orden en que se especifiquen el campo principal y el campo incrustado. El siguiente $project falla con el mismo error:

{ $project: { "contact.address.country": 1, contact: 1 } }

Cuando se usa una etapa $project, normalmente debería ser la última etapa del pipeline, utilizada para especificar qué campos devolver al cliente.

Usar una etapa $project al principio o en medio de un pipeline para reducir el número de campos que se pasan a las etapas posteriores del pipeline es poco probable que mejore el rendimiento, ya que la base de datos realiza esta optimización automáticamente.

MongoDB devuelve un error si se pasa un documento vacío a la etapa $project.

Por ejemplo, la siguiente canalización devuelve un error:

db.myCollection.aggregate( [ {
$project: { }
} ] )

No puedes utilizar un índice de arreglo con la etapa $project.

Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.

La siguiente etapa $project incluye únicamente los campos _id, title y rated:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { title: 1, rated: 1 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
rated: 'TV-G'
}
]

MongoDB incluye el campo _id por defecto. Para excluir el campo _id de la etapa $project, establezca el campo _id en 0 en el documento de proyección.

La siguiente etapa $project excluye el campo _id pero incluye los campos title y rated:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project : { _id: 0, title : 1, rated : 1 } },
{ $limit: 1 }
] )
[ { title: 'The Great Train Robbery', rated: 'TV-G' } ]

La siguiente etapa $project excluye el campo rated de la salida:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project : { "rated": 0 } },
{ $limit: 1 }
] )

De manera alternativa, utiliza la etapa $unset para excluir campos.

La siguiente etapa $project excluye los campos imdb.id y type de la salida:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { "imdb.id": 0, "type": 0 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
plot: 'A group of bandits stage a brazen train hold-up, only to find a determined posse hot on their heels.',
genres: [ 'Short', 'Western' ],
runtime: 11,
cast: [
'A.C. Abadie',
"Gilbert M. 'Broncho Billy' Anderson",
'George Barnes',
'Justus D. Barnes'
],
poster: 'https://m.media-amazon.com/images/M/MV5BMTU3NjE5NzYtYTYyNS00MDVmLWIwYjgtMmYwYWIxZDYyNzU2XkEyXkFqcGdeQXVyNzQzNzQxNzI@._V1_SY1000_SX677_AL_.jpg',
title: 'The Great Train Robbery',
fullplot: "Among the earliest existing films in American cinema - notable as the first film that presented a narrative story to tell - it depicts a group of cowboy outlaws who hold up a train and rob the passengers. They are then pursued by a Sheriff's posse. Several scenes have color included - all hand tinted.",
languages: [ 'English' ],
released: ISODate('1903-12-01T00:00:00.000Z'),
directors: [ 'Edwin S. Porter' ],
rated: 'TV-G',
awards: { wins: 1, nominations: 0, text: '1 win.' },
lastupdated: '2015-08-13 00:27:59.177000000',
year: 1903,
imdb: { rating: 7.4, votes: 9847 },
countries: [ 'USA' ],
tomatoes: {
viewer: { rating: 3.7, numReviews: 2559, meter: 75 },
fresh: 6,
critic: { rating: 7.6, numReviews: 6, meter: 100 },
rotten: 0,
lastUpdated: ISODate('2015-08-08T19:16:10.000Z')
},
num_mflix_comments: 0
}
]

Alternativamente, se puede anidar la especificación de exclusión en un documento:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { "imdb": { "id": 0 }, "type" : 0 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
plot: 'A group of bandits stage a brazen train hold-up, only to find a determined posse hot on their heels.',
genres: [ 'Short', 'Western' ],
runtime: 11,
cast: [
'A.C. Abadie',
"Gilbert M. 'Broncho Billy' Anderson",
'George Barnes',
'Justus D. Barnes'
],
poster: 'https://m.media-amazon.com/images/M/MV5BMTU3NjE5NzYtYTYyNS00MDVmLWIwYjgtMmYwYWIxZDYyNzU2XkEyXkFqcGdeQXVyNzQzNzQxNzI@._V1_SY1000_SX677_AL_.jpg',
title: 'The Great Train Robbery',
fullplot: "Among the earliest existing films in American cinema - notable as the first film that presented a narrative story to tell - it depicts a group of cowboy outlaws who hold up a train and rob the passengers. They are then pursued by a Sheriff's posse. Several scenes have color included - all hand tinted.",
languages: [ 'English' ],
released: ISODate('1903-12-01T00:00:00.000Z'),
directors: [ 'Edwin S. Porter' ],
rated: 'TV-G',
awards: { wins: 1, nominations: 0, text: '1 win.' },
lastupdated: '2015-08-13 00:27:59.177000000',
year: 1903,
imdb: { rating: 7.4, votes: 9847 },
countries: [ 'USA' ],
tomatoes: {
viewer: { rating: 3.7, numReviews: 2559, meter: 75 },
fresh: 6,
critic: { rating: 7.6, numReviews: 6, meter: 100 },
rotten: 0,
lastUpdated: ISODate('2015-08-08T19:16:10.000Z')
},
num_mflix_comments: 0
}
]

De manera alternativa, utiliza la etapa $unset para excluir campos.

Puedes usar la variable REMOVE en expresiones de agregación para suprimir condicionalmente un campo.

La siguiente etapa $project utiliza la variable REMOVE para excluir el campo imdb.votes si es igual a null o es una cadena vacía:

db.movies.aggregate( [
{ $match: { title: "This Is Spinal Tap" } },
{
$project: {
title: 1,
"imdb.rating": 1,
"imdb.id": 1,
"imdb.votes": {
$cond: {
if: { $in: [ "$imdb.votes", [ null, "" ] ] },
then: "$$REMOVE",
else: "$imdb.votes"
}
}
}
},
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1398f29313caabce94a3'),
title: 'This Is Spinal Tap',
imdb: { rating: 8, id: 88258 }
}
]

Como imdb.votes es una string vacía para este document, MongoDB excluye el campo de la salida.

Tip

Comparación con $addFields

Puedes usar la plataforma $addFields o $project para remover campos de documentos. El mejor enfoque depende de su pipeline y de cuánto del documento original desea conservar.

Para ver un ejemplo de uso de $$REMOVE en una etapa $addFields, consulte Remover campos.

Los documentos en la colección movies contienen un document imdb incrustado con los campos rating, votes y id. Para incluir únicamente el campo rating del document imdb, utiliza la notación de punto:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { "imdb.rating": 1 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
imdb: { rating: 7.4 }
}
]

O bien, anide la especificación de inclusión en un document:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { imdb: { rating: 1 } } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
imdb: { rating: 7.4 }
}
]

La siguiente etapa $project agrega los campos leadActor y releaseYear:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{
$project: {
title: 1,
leadActor: { $arrayElemAt: [ "$cast", 0 ] },
releaseYear: "$year"
}
},
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
leadActor: 'A.C. Abadie',
releaseYear: 1903
}
]

La siguiente operación proyecta los campos year y runtime como elementos en un nuevo campo myArray:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { myArray: [ "$year", "$runtime" ] } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
myArray: [ 1903, 11 ]
}
]

Si la especificación del arreglo incluye campos que no existen en un documento, la operación sustituye null por el valor de ese campo.

Por ejemplo, con el mismo documento que el anterior, la siguiente operación proyecta los campos year, runtime y un campo inexistente $someField como elementos en un nuevo campo myArray:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { myArray: [ "$year", "$runtime", "$someField" ] } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
myArray: [ 1903, 11, null ]
}
]

Los ejemplos de C# en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos en la documentación del controlador de MongoDB .NET/C#.

Para agregar una etapa $project con el controlador MongoDB .NET/C#, llame al método Project() en un objeto PipelineDefinition y pase un objeto ProjectionDefinitionBuilder<TDocument>. TDocument es la clase que representa los documentos de la colección.

Para incluir campos específicos al usar el controlador .NET/C#, llame al método Include() en el generador de proyecciones. Puede encadenar llamadas a Include() para incluir varios campos.

El siguiente ejemplo de código produce un documento que incluye únicamente los campos _id, plot y title:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>.Projection
.Include(m => m.Title)
.Include(m => m.Plot)
);

Para excluir un campo de los documentos de resultados al usar el controlador .NET/C#, llame al método Exclude() en el generador de proyecciones. Puede encadenar llamadas a Exclude() para excluir varios campos.

El siguiente ejemplo de código produce un documento que excluye el campo Type:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>.Projection
.Exclude(m => m.Type)
);

Por defecto, los documentos de resultados incluyen el campo _id. El siguiente ejemplo excluye _id pero incluye los campos plot y title:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>.Projection
.Exclude(m => m.Id)
.Include(m => m.Title)
.Include(m => m.Plot)
);

Para excluir un campo en un documento incrustado al usar el controlador .NET o .NET/C#, llame al método Exclude() en el generador de proyecciones y pase la ruta a la propiedad de clase correspondiente. Puede encadenar llamadas a Exclude() para excluir varios campos.

El siguiente ejemplo de código produce un documento que excluye los campos imdb.id y type:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>.Projection
.Exclude("Imdb.id")
.Exclude(m => m.Type)
);

Nota

Utilizar cadenas para los campos de ID incrustados

Para proyectar un campo de ID en un documento incrustado, especificar el nombre del campo como un string, no como una expresión lambda.

Puedes usar la variable REMOVE en expresiones de agregación para suprimir condicionalmente un campo:

var stage = new BsonDocument
{
{ "title", 1 },
{ "imdb.id", 1 },
{ "imdb.rating", 1 },
{
"imdb.votes", new BsonDocument("$cond", new BsonDocument
{
{ "if", new BsonDocument("$eq", new BsonArray { "", "$imdb.votes" }) },
{ "then", "$$REMOVE" },
{ "else", "$imdb.votes" }
})
}
};
var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(stage);

Nota

No hay desarrollador para la exclusión condicional

El ejemplo anterior utiliza objetos BsonDocument porque el controlador .NET/C# no proporciona un constructor para excluir campos de forma condicional. Otros controladores de lenguaje para MongoDB podrían admitir esta función. Consulte la documentación del controlador de MongoDB para obtener más información.

Para incluir campos calculados en los documentos de resultados al usar el controlador .NET/C#, llame al método Expression() en el generador de proyecciones y pase una expresión que incluya los campos calculados. Para mayor seguridad de tipos, puede definir una clase de modelo para los documentos de resultados, como la siguiente clase ProjectedMovie:

[BsonIgnoreExtraElements]
public class ProjectedMovie
{
[BsonId]
public ObjectId Id { get; set; }
public string Title { get; set; } = null!;
public string? LeadActor { get; set; }
public List<string>? Crew { get; set; }
}

El siguiente ejemplo de código genera un documento que contiene múltiples campos calculados:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>
.Projection
.Expression(m => new ProjectedMovie
{
Id = m.Id,
Title = m.Title,
LeadActor = m.Cast![0],
})
);

Para proyectar nuevos campos de matriz en los documentos de resultado al usar el controlador .NET/C#, llame al método Expression() en el generador de proyección y pase una expresión que incluya los nuevos campos de matriz. Para mayor seguridad de tipos, puede definir una clase de modelo para los documentos de resultado, como la siguiente clase ProjectedMovie:

[BsonIgnoreExtraElements]
public class ProjectedMovie
{
[BsonId]
public ObjectId Id { get; set; }
public string Title { get; set; } = null!;
public string? LeadActor { get; set; }
public List<string>? Crew { get; set; }
}

El siguiente ejemplo de código produce documentos que incluyen un nuevo campo de arreglo, crew, que contiene valores de los campos directors y writers:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>
.Projection
.Expression(m => new ProjectedMovie
{
Id = m.Id,
Title = m.Title,
LeadActor = m.Cast![0],
Crew = m.Directors!.Concat(m.Writers!).ToList()
})
);

Si la especificación de la matriz incluye campos que no existen en un documento, la canalización sustituye null como valor para ese campo. Por ejemplo, el siguiente código proyecta los campos directors, writers y un campo inexistente, makeupArtists, como elementos en un nuevo campo llamado crew:

var stage = new BsonDocument
{
{ "crew", new BsonArray { "$directors", "$writers", "$makeupArtists" } }
};
var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(stage);

Nota

La clase de desarrolladores previene que falten campos

El ejemplo anterior utiliza objetos BsonDocument porque el controlador .NET/C# devuelve un error de compilación si se intenta usar constructores para agregar un campo faltante a una matriz. Es posible que otros controladores de lenguaje de MongoDB admitan esta función. Consulte la documentación del controlador de MongoDB para obtener más información.

Los ejemplos de Node.js en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.

Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $project a una canalización de agregación, utilice el Operador $project en un objeto de canalización.

Las siguientes secciones muestran cómo personalizar los documentos de salida de la etapa $project.

Para incluir campos específicos, establece el valor del campo en 1 en la etapa $project.

El siguiente ejemplo devuelve documentos que incluyen únicamente los campos _id, plot y title:

const pipeline = [
{
$project: {
title: 1,
plot: 1
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Los documentos de salida se asemejan al siguiente ejemplo:

{
_id: new ObjectId('573a1390f29313caabcd42e8'),
plot: 'A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.',
title: 'The Great Train Robbery'
}

Para excluir campos específicos, establezca el valor del campo en 0 en la etapa $project.

El siguiente ejemplo devuelve documentos que excluyen el campo type:

const pipeline = [
{
$project: {
type: 0
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Por defecto, los documentos resultantes incluyen el campo _id. El siguiente ejemplo devuelve documentos que excluyen el campo _id pero incluyen los campos plot y title:

const pipeline = [
{
$project: {
_id: 0,
title: 1,
plot: 1
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Los documentos de salida se asemejan al siguiente ejemplo:

{
plot: 'A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.',
title: 'The Great Train Robbery'
}

Para excluir un campo en un documento incrustado, establece el valor de la ruta de campo en 0 en la etapa $project.

Nota

Utiliza cadenas para los campos incrustados

Para proyectar un campo en un documento incrustado, especifica la ruta de campo como una string.

El siguiente ejemplo devuelve documentos que excluyen los campos imdb.id y type:

const pipeline = [
{
$project: {
"imdb.id": 0,
type: 0
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Los documentos de salida se asemejan al siguiente ejemplo:

{
plot: 'A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.',
title: 'The Great Train Robbery',
imdb: { rating: 7.4000000000000004, votes: 9847 }
}

Para excluir condicionalmente un campo, asigna una lógica condicional que incluya la variable REMOVE al nombre del campo.

const pipeline = [
{
$project: {
title: 1,
"imdb.id": 1,
"imdb.rating": 1,
"imdb.votes": {
$cond: {
if: { $eq: ["$imdb.votes", ""] },
then: "$REMOVE",
else: "$imdb.votes"
}
}
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Si un documento contiene el campo imdb.votes, el pipeline devuelve documentos que se asemejan al siguiente ejemplo de salida:

{
_id: new ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
imdb: { rating : 7.4000000000000004, id: 439, votes: 9847 }
}

Si un documento no contiene el campo imdb.votes, la canalización devuelve documentos que se asemejan al siguiente ejemplo de salida:

{
_id: new ObjectId('573a1390f29313caabcd42e8'),
title: 'This Is Spinal Tap',
imdb: { rating: 8.0, id: 88258 }
}

Para incluir campos calculados en los documentos de resultados, asigna una expresión al campo que almacena los resultados.

El siguiente ejemplo proyecta los campos _id y title en nuevos campos con el mismo nombre y calcula el nuevo campo leadActor. El ejemplo luego devuelve documentos que incluyen estos campos:

const pipeline = [
{
$project: {
_id: "$_id",
title: "$title",
leadActor: { $arrayElemAt: ["$cast", 0] }
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;
{
_id: new ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
leadActor: 'A.C. Abadie'
}

Para proyectar nuevos campos de arreglo en los documentos de resultados, asigna una expresión que calcule el nuevo campo de arreglo al campo que almacena el arreglo.

El siguiente ejemplo devuelve documentos que incluyen un nuevo campo de arreglo, crew, que combina valores de los campos directors y writers:

const pipeline = [
{
$project: {
_id: "$_id",
title: "$title",
leadActor: { $arrayElemAt: ["$cast", 0] },
crew: { $concatArrays: ["$directors", "$writers"] }
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Ejemplo de salida:

{
_id: new ObjectId('573a1395f29313caabce2297'),
title: 'The Chalk Garden',
leadActor: 'Deborah Kerr',
crew: ['Ronald Neame', 'John Michael Hayes (screenplay)', 'Enid Bagnold (from the play by)']
}

Si la especificación de la matriz incluye campos que no están en un documento, la canalización sustituye null como valor para ese campo. Por ejemplo, el siguiente ejemplo proyecta los campos directors, writers y un campo inexistente, makeupArtists, como elementos en un nuevo campo llamado crew:

const pipeline = [
{
$project: {
crew: ["$directors", "$writers", "$makeupArtists"]
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Ejemplo de salida:

{
_id: new ObjectId('573a1399f29313caabced0d9'),
crew: [['Bill Kroyer'], ['Jim Cox (screenplay)', 'Diana Young (original stories)'], null]
}

Para obtener más información sobre las tareas de agregación comunes,consulte los tutoriales completos sobre la canalización de agregación.

Para obtener más información sobre las expresiones y variables de esta página, consulte: