Visão geral
Use uma projeção para controlar quais campos aparecem nos documentos retornados pelas operações de leitura. Muitas solicitações exigem apenas determinados campos, portanto, as projeções podem ajudar a limitar o uso desnecessário da largura de banda da rede. As projeções funcionam de duas formas:
Inclua campos explicitamente com um valor de
1
. Isso tem o efeito colateral de excluir implicitamente todos os campos não especificados.Exclua implicitamente campos com valor
0
. Isso tem o efeito colateral de incluir implicitamente todos os campos não especificados.
Esses dois métodos de projeção são mutuamente exclusivos: se você incluir campos explicitamente, não poderá excluir campos explicitamente e vice-versa.
Documentos de amostra
Para seguir os exemplos deste guia, utilize o seguinte snippet de código para inserir documentos que descrevem frutas na coleção myDB.fruits
:
const myDB = client.db("myDB"); const myColl = myDB.collection("fruits"); await myColl.insertMany([ { "_id": 1, "name": "apples", "qty": 5, "rating": 3 }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 1 }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2 }, { "_id": 4, "name": "avocados", "qty": 3, "rating": 5 }, ]);
Observação
Sua operação de query pode retornar uma referência a um cursor que contém documentos correspondentes. Para saber como examinar os dados armazenados no cursor, consulte apágina Fundamentos do cursor .
Campo Único
Na query a seguir, passe a projeção para retornar somente o campo name
de cada documento:
// return only* the name field const projection = { name: 1 }; const cursor = myColl.find().project(projection); for await (const doc of cursor) { console.dir(doc); }
O documento de projeção especifica um valor de 1
para name
. Isso instrui a operação a incluir o campo name
de cada documento retornado nos resultados e excluir os campos qty
e rating
. Passar essa projeção para find()
com um query vazio e nenhum documento de classificação produz os seguintes resultados:
{ "_id": 1, "name": "apples" } { "_id": 2, "name": "bananas" } { "_id": 3, "name": "oranges" } { "_id": 4, "name": "avocados" }
Embora essa projeção incluísse explicitamente apenas o campo name
, a query também retornou o campo _id
.
O campo _id
é um caso especial porque é sempre incluído em cada consulta, a menos que explicitamente especificado de outra forma. Isso ocorre porque _id
é um identificador exclusivo para cada documento, uma propriedade que geralmente é usada ao criar consultas. Os dados de coleta movies
demonstram por que essa propriedade é necessária: dois ou mais filmes podem ter o mesmo título, como remakes de filmes. Por isso, você precisa de um valor de _id
exclusivo para fazer referência confiável a um filme específico. _id
é a única exceção ao comportamento mutuamente exclusivo de incluir-excluir em projeções: você pode excluir explicitamente _id
mesmo ao incluir explicitamente outros campos se não quiser que _id
esteja presente nos documentos retornados.
// return only the name field const projection = { _id: 0, name: 1 }; const cursor = myColl.find().project(projection); for await (const doc of cursor) { console.dir(doc); }
O documento de projeção especifica um valor de 1
para name
e 0
para _id
. Isto instrui a operação a incluir o campo name
de cada documento retornado nos resultados e exclui os campos _id
, qty
e rating
. Passar essa projeção para find()
com um documento de query vazio e nenhum documento de classificação produz os seguintes resultados:
{ "name": "apples" } { "name": "bananas" } { "name": "oranges" } { "name": "avocados" }
Vários campos
Você também pode especificar vários campos para incluir em sua projeção. Observação: a ordem em que você especifica os campos na projeção não altera a ordem em que eles são retornados.
const projection = { _id: 0, rating: 1, name: 1 }; const cursor = myColl.find().project(projection); for await (const doc of cursor) { console.dir(doc); }
Este exemplo que identifica dois campos a serem incluídos na projeção gera os seguintes resultados:
{ "name": "apples", "rating": 3 } { "name": "bananas", "rating": 1 } { "name": "oranges", "rating": 2 } { "name": "avocados", "rating": 5 }
Para obter mais exemplos de projeção, consulte a página Manual do MongoDB em Campos de projeto para retorno da query.