Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$ projeto ( estágio de agregação )

$project

Passa os documentos com os campos solicitados para o próximo estágio do pipeline. Os campos especificados podem ser campos existentes começando nos documentos de entrada ou novos campos calculados.

$project pode:

  • Incluir campos dos documentos de entrada.

  • Suprima o campo_id.

  • Adicione novos campos ou redefina os valores dos campos existentes.

  • Exclua campos dos documentos de entrada.

Você pode utilizar o $project para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem
  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

$project tem o seguinte formato:

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

As especificações do $project vêm nos seguintes formatos:

Formato
Descrição

<field>: <1 or true>

Especifica a inclusão de um campo. Números inteiros diferentes de zero também são tratados como true.

_id: <0 or false>

Especifica a supressão do campo_id.

Para excluir um campo condicionalmente, use a variável REMOVE. Para obter detalhes, consulte Excluir campos condicionalmente.

<field>: <expression>

Adiciona um novo campo ou redefine o valor de um campo existente.

Se a expressão avaliar para $$REMOVE, o campo será excluído na saída. Para obter detalhes, consulte Excluir campos condicionalmente.

<field>: <0 or false>

Especifica a exclusão de um campo.

Para excluir um campo condicionalmente, use a variável REMOVE. Para obter detalhes, consulte Excluir campos condicionalmente.

Se você especificar a exclusão de um campo diferente de _id,não poderá usar nenhuma outra especificação $project. Esta restrição não se aplica à exclusão condicional de um campo usando a variável REMOVE.

Para excluir campos, você também pode usar o estágio $unset.

  • Por padrão, os documentos de saída incluem o campo_id. Para incluir outros campos dos documentos de entrada, especifique-os explicitamente em $project.

  • Se você especificar a inclusão de um campo que não existe no documento, $project ignorará a inclusão do campo e não o adicionará ao documento.

Por padrão, o campo _id é incluído nos documentos de saída. Para excluir o campo _id dos documentos de saída, você deve suprimir explicitamente o campo _id em $project.

Se você excluir um campo}, todos os outros campos aparecerão nos documentos de saída.

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

Se você excluir um campo diferente de _id, não poderá usar outros formulários de especificação $project. Se você excluir campos, também não poderá especificar a inclusão de campos, redefinir o valor dos campos existentes ou adicionar novos campos. Esta restrição não se aplica à exclusão condicional de um campo usando a variável REMOVE.

Para excluir campos, você também pode usar $unset.

Você pode usar a variável REMOVE em expressões de agregação para suprimir condicionalmente um campo. Para obter um exemplo, consulte Excluir campos condicionalmente.

Observação

O MongoDB stambém fornece $addFields para adicionar novos campos aos documentos.

Para adicionar um novo campo ou para redefinir o valor de um campo existente, especifique o nome do campo e defina seu valor para uma expressão. Para mais informações sobre expressões, consulte Expressões.

Para definir um campo como um literal numérico ou booleano em vez de uma expressão que se resolve em um literal, use o operador $literal. Caso contrário, $project trata o literal como sinalizador para incluir ou excluir o campo.

Ao especificar um novo campo e definir seu valor como o caminho do campo de um campo existente, você pode renomear um campo de forma eficaz.

O estágio $project suporta o uso dos colchetes [] para criar diretamente novos campos de array. Se você especificar campos de array que não existem em um documento, a operação substituirá o null como o valor desse campo. Para ver um exemplo, consulte Projetar novos campos de array.

Você não pode usar um índice de array com o estágio $project.

Para projeto, adicionar ou redefinir um campo em um documento incorporado, você pode usar a notação de ponto:

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

Você também pode aninhar os campos:

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

Ao aninhar campos, você não pode usar a notação de ponto dentro do documento incorporado para especificar o campo. Por exemplo, contact: { "address.country": <1 or 0 or expression> } é inválido.

Não é possível especificar um documento incorporado e um campo dentro desse documento incorporado na mesma projeção.

O estágio $project a seguir falha com um erro Path collision porque tenta projeto o documento contact incorporado e o campocontact.address.country :

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

O erro ocorre independentemente da ordem em que você especifica o campo principal e incorporado. O seguinte $project falha com o mesmo erro:

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

Quando você usa um estágio $project, ele normalmente deve ser o último estágio do pipeline, usado para especificar quais campos devem ser retornados ao cliente.

É improvável que o uso de um estágio $project no início ou no meio de um pipeline para reduzir o número de campos passados para estágios subsequentes melhore o desempenho, pois o banco de dados executa essa otimização automaticamente.

O MongoDB retorna um erro se o estágio $project for passado como um documento vazio.

Por exemplo, o pipeline a seguir retorna um erro:

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

Você não pode usar um índice de array com o estágio $project.

Os exemplos nesta página usam dados do conjunto de dados sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.

O seguinte estágio $project inclui apenas os campos _id, title e 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'
}
]

O MongoDB inclui o campo _id por padrão. Para excluir o campo _id do estágio $project, defina o campo _id como 0 no documento de projeção .

O seguinte estágio $project exclui o campo _id, mas inclui os campos title e 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' } ]

O estágio $project a seguir exclui o campo rated da saída:

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

Alternativamente, utilize o estágio $unset para excluir campos.

O seguinte estágio $project exclui os campos imdb.id e type da saída:

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
}
]

Como alternativa, você pode aninhar a especificação de exclusão em um 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
}
]

Alternativamente, utilize o estágio $unset para excluir campos.

Você pode usar a variável REMOVE em expressões de aggregation para suprimir condicionalmente um campo.

O estágio $project a seguir usa a variável REMOVE para excluir o campo imdb.votes se ele for igual a null ou for uma string vazia:

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 é uma string vazia para este document, o MongoDB exclui o campo da saída.

Dica

Comparação com $addFields

Você pode usar o estágio $addFields ou $project para remover campos do documento. A melhor abordagem depende do seu pipeline e de quanto do documento original você deseja manter.

Para ver um exemplo usando $$REMOVE em um estágio $addFields , consulte Remover campos.

Os documentos na coleção movies contêm um document imdb incorporado com os campos rating, votes e id. Para incluir somente o campo rating do document imdb, use notação de ponto:

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

Ou aninhe a especificação de inclusão em um document:

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

O seguinte estágio $project adiciona os campos leadActor e 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
}
]

A seguinte operação projeta os campos year e runtime como elementos em um novo campo myArray :

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

Se a especificação da array incluir campos que não existem em um documento, a operação substituirá null como o valor desse campo.

Por exemplo, com o mesmo documento acima, a operação a seguir projeta os campos year, runtime e um campo $someField inexistente como elementos em um novo 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 ]
}
]

Para obter mais informações sobre tarefas de agregação comuns, consulte Tutoriais de Pipeline de Agregação Completo.

Para saber mais sobre as expressões e variáveis nesta página, consulte: