Especifique quais campos retornar
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 acompanhar os exemplos deste guia, use o seguinte trecho 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" }
Apesar do fato de que essa projeção só incluía explicitamente o campo name
, a query retornou o campo _id
também!
Isso acontece porque o campo _id
é um caso especial: ele sempre é incluído em todas as queries, a menos que seja explicitamente especificado de outra forma. Isso porque o _id
é um identificador exclusivo para cada documento, uma propriedade que pode ser muito útil ao construir queries. A coleção movies
é um bom exemplo da utilidade dessa propriedade: como as refilmagens e até mesmo os trabalhos separados podem, às vezes, reutilizar títulos de filmes, você precisa de um valor _id
exclusivo para se referir a qualquer 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 exemplos de projeção adicionais, consulte a página Manual do MongoDB em Campos do projeto a serem retornados da query.