Definición
$projectPasa 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.
$projectpoder: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.
Compatibilidad
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.
Sintaxis
$project tiene la siguiente forma:
{ $project: { <specification(s)> } }
Las especificaciones $project tienen las siguientes formas:
formulario | Descripción |
|---|---|
| Especifica la inclusión de un campo. Los enteros distintos de cero también se tratan como |
| Especifica la supresión del campo Para excluir un campo de forma condicional, utiliza la variable |
| Añade un nuevo campo o restablece el valor de un campo existente. Si la expresión se evalúa como |
| Especifica la exclusión de un campo. Para excluir un campo de forma condicional, utiliza la variable Si especifica la exclusión de un campo distinto de Para excluir campos, también puedes utilizar la etapa |
Comportamiento
Incluir campos
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,
$projectignora esa inclusión de campo y no agrega el campo al documento.
Campo _id
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.
Excluir campos
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.
Excluir campos de forma condicional
Puedes usar la variable REMOVE en expresiones de agregación para suprimir condicionalmente un campo. Para un ejemplo, ve Excluir campos condicionalmente.
Añadir nuevos campos o restablecer los campos existentes
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.
Valores literales
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.
Renombrar 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.
Nuevos campos de arreglo
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.
Campos de documento incrustado
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.
Errores de colisión de rutas en campos incrustados
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 } }
$proyecto Colocación en el escenario
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.
Especificación vacía
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: { } } ] )
Array Index
No puedes utilizar un índice de arreglo con la etapa $project.
Ejemplos
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.
Incluir campos específicos en los documentos de salida
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' } ]
Suprimir el campo _id en los documentos de salida.
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' } ]
Excluir campos de los documentos de salida
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.
Excluir campos de documentos incrustados
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.
Excluir campos condicionalmente
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.
Incluir campos específicos de documentos incrustados
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 } } ]
Incluir campos calculados
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 } ]
Proyecto de nuevos campos de arreglo
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.
Incluir campos específicos en los documentos de salida
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) );
Excluir campos de los documentos de salida
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) );
Excluir campos de documentos incrustados
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.
Excluir campos condicionalmente
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.
Incluir campos calculados
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:
[] public class ProjectedMovie { [] 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], }) );
Proyecto de nuevos campos de arreglo
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:
[] public class ProjectedMovie { [] 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.
Incluir campos específicos en los documentos de salida
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' }
Excluir campos de los documentos de salida
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' }
Excluir campos de documentos incrustados
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 } }
Excluir campos condicionalmente
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 } }
Incluir campos calculados
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' }
Proyecto de nuevos campos de arreglo
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] }
Obtén más información
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: