Overview
Utilice una proyección para controlar los campos que aparecen en los documentos devueltos por las operaciones de lectura. Muchas solicitudes solo requieren ciertos campos, por lo que las proyecciones pueden ayudarle a limitar el uso innecesario del ancho de banda de la red. Las proyecciones funcionan de dos maneras:
Incluir explícitamente los campos con un valor de
1Esto tiene el efecto secundario de excluir implícitamente todos los campos no especificados.Excluye implícitamente los campos con un valor de
0. Esto tiene el efecto secundario de incluir implícitamente todos los campos no especificados.
Estos dos métodos de proyección son mutuamente excluyentes: si incluyes explícitamente campos, no puedes excluir explícitamente campos y viceversa.
Documentos de muestra
Para seguir los ejemplos de esta guía, utilice el siguiente fragmento de código para insertar documentos que describan frutas en la colección 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 }, ]);
Nota
Tu operación de consulta puede devolver una referencia a un cursor que contenga documentos coincidentes. Para aprender a examinar los datos almacenados en el cursor, consulta el Acceder a los datos desde una página de cursor.
Campo único
En la siguiente query, pasa la proyección para devolver únicamente el campo name de cada documento:
// return only* the name field const projectFields = { name: 1 }; const cursor = myColl.find().project(projectFields); for await (const doc of cursor) { console.dir(doc); }
El documento de proyección especifica un valor de 1 para name. Esto instruye a la operación a incluir el campo name de cada documento devuelto en los resultados y excluir los campos qty y rating. Pasar esta proyección a find() con un documento de query vacío y sin documento de ordenación produce los siguientes resultados:
{ "_id": 1, "name": "apples" } { "_id": 2, "name": "bananas" } { "_id": 3, "name": "oranges" } { "_id": 4, "name": "avocados" }
Aunque esta proyección solo incluía explícitamente el campo name, la query también devolvió el campo _id.
El campo _id es un caso especial porque siempre está incluido en todas las consultas a menos que se especifique explícitamente lo contrario. Esto se debe a que _id es un identificador único para cada documento, una propiedad que se utiliza a menudo al construir consultas. Los datos de colección movies demuestran por qué esta propiedad es necesaria: dos o más películas pueden compartir el mismo título, como en el caso de remakes de películas. Por esta razón, necesitas un valor único de _id para poder referenciar de manera confiable una película específica. _id es la única excepción al comportamiento de incluir-excluir mutuamente excluyente en proyecciones: puede excluir explícitamente _id incluso cuando se incluyen explícitamente otros campos si no se desea que _id esté presente en los documentos devueltos.
// return only the name field const projectFields = { _id: 0, name: 1 }; const cursor = myColl.find().project(projectFields); for await (const doc of cursor) { console.dir(doc); }
El documento de proyección especifica un valor de 1 para name y 0 para _id. Esto indica que la operación incluya el campo name de cada documento devuelto en los resultados y excluya los campos _id, qty y rating. Pasar esta proyección a find() con un documento de query vacío y sin documento de ordenación produce los siguientes resultados:
{ "name": "apples" } { "name": "bananas" } { "name": "oranges" } { "name": "avocados" }
Campos múltiples
También puede especificar varios campos para incluir en su proyección. Nota: el orden en que se especifican los campos en la proyección no altera el orden en que se devuelven.
const projectFields = { _id: 0, rating: 1, name: 1 }; const cursor = myColl.find().project(projectFields); for await (const doc of cursor) { console.dir(doc); }
Este ejemplo que identifica dos campos a incluir en la proyección muestra los siguientes resultados:
{ "name": "apples", "rating": 3 } { "name": "bananas", "rating": 1 } { "name": "oranges", "rating": 2 } { "name": "avocados", "rating": 5 }
Para más ejemplos de proyección, consulte la Página del manual de MongoDB sobre los campos de proyecto que se devolverán en la query.
Nota
Se debe encadenar un método de cursor como sort(), limit(), skip() o project() a una operación de lectura antes de iterar el cursor. Si se especifica un método de cursor después de iterar el cursor, la configuración no se aplica a la operación de lectura.