Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Especifica qué campos se deben devolver

En esta guía, puedes aprender a controlar qué campos aparecen en los documentos devueltos de las operaciones de lectura con el controlador Java de MongoDB.

Muchas solicitudes de lectura requieren solo un subconjunto de campos en un documento. Por ejemplo, al iniciar sesión un usuario, tal vez solo necesites su nombre de usuario, y no toda su información de perfil. Por defecto, las queries en MongoDB devuelven todos los campos en los documentos que coinciden. Puedes usar una proyección para devolver solo los datos que necesitas.

Una proyección es un documento que indica a MongoDB qué campos de un documento se deben devolver. Usa la Proyecciones clase para construir un documento de proyección.

Las proyecciones funcionan de dos maneras:

  • Inclusión explícita de campos. Esto tiene el efecto secundario de excluir implícitamente todos los campos no especificados.

  • Excluir implícitamente campos. Esto tiene como efecto secundario 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.

Importante

La _id campo no está sujeto a estas mecánicas. Debes excluir explícitamente el campo _id si no deseas que se devuelva. Puedes excluir el campo _id incluso si has especificado ciertos campos para incluir.

Considere la siguiente colección que contiene documentos que describen variedades de frutas:

{ "_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 },

En la siguiente query, pasa la proyección para devolver el campo name de cada documento:

// return all documents with *only* the name field
Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name"));
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

El documento de proyección especifica que el resultado de la operación de lectura debe incluir el campo name de cada documento devuelto. Como resultado, esta proyección excluye implícitamente los campos qty y rating. La vinculación de esta proyección a find() con un filtro de query vacío arroja los siguientes resultados:

{ "_id": 1, "name": "apples" }
{ "_id": 2, "name": "bananas" }
{ "_id": 3, "name": "oranges" }
{ "_id": 4, "name": "avocados" }

A pesar de que 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: siempre se incluye en cada resultado de query a menos que se excluya explícitamente. Esto se debe a que el campo _id es un identificador único para cada documento, una propiedad que puede ser útil al construir query.

Una colección de movies es un buen ejemplo de por qué esta propiedad es útil: debido a que las películas nuevas y hasta obras separadas a veces reutilizan títulos de películas, se necesita un valor _id único para referirse a una película específica.

La _id es la única excepción al comportamiento mutuamente excluyente de inclusión-exclusión en las proyecciones: se puede excluir explícitamente el campo _id incluso cuando se incluyen explícitamente otros campos si no se desea que _id esté presente en los documentos devueltos.

// return all documents with only the name field
Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name"), Projections.excludeId());
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

El documento de proyección especifica que el resultado de la operación de lectura debe incluir el campo name de cada documento devuelto, y especifica excluir el campo _id. Como resultado, esta proyección excluye implícitamente los campos qty y rating. Encadenar esta proyección a find() con un filtro de query vacío produce los siguientes resultados:

{ "name": "apples" }
{ "name": "bananas" }
{ "name": "oranges" }
{ "name": "avocados" }

También puedes especificar múltiples campos para incluir en tu proyección.

Tip

El orden en el que se especifican los campos en la proyección no altera el orden en que se devuelven.

Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name", "rating"), Projections.excludeId());
collection.find(filter).projection(projection).forEach(doc -> System.out.println(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 ejemplos adicionales de proyección, consulta el Página del manual de MongoDB sobre los campos de proyecto que se devolverán en la query.

Volver

Recuperar valores únicos de un campo

En esta página