Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Desarrolladores de proyecciones

En esta guía, puede aprender a especificar proyecciones usando desarrolladores en el controlador Java de MongoDB.

MongoDB admite la proyección de campos, especificando qué campos incluir y excluir al devolver resultados de una consulta. La proyección en MongoDB sigue algunas reglas básicas:

  • La _id el campo se incluye siempre a menos que se excluya explícitamente

  • Especificar un campo para inclusión excluye implícitamente todos los demás campos excepto el campo _id

  • Al especificar un campo para exclusión, se elimina únicamente ese campo en el resultado de una consulta.

Encuentra más información sobre la mecánica de proyección aquí.

La Projections clase proporciona métodos de fábrica estáticos para todos los operadores de proyección de MongoDB. Cada método devuelve una instancia del tipo BSON que se puede pasar a cualquier método que espere una proyección.

Tip

Para abreviar, puede optar por importar los métodos de las Proyecciones clase estáticamente:

import static com.mongodb.client.model.Projections.*;

Los siguientes ejemplos asumen esta importación estática.

Las siguientes secciones presentan ejemplos que ejecutan operaciones de consulta y proyección en una colección de muestra llamada projection_builders. Cada sección utiliza una variable llamada collection para referirse a la instancia MongoCollection de la colección projection_builders.

La colección contiene los siguientes documentos, que representan las temperaturas medias mensuales en grados Celsius para los años 2018 y 2019:

{
"year" : 2018,
"type" : "even number but not a leap year",
"temperatures" : [
{ "month" : "January", "avg" : 9.765 },
{ "month" : "February", "avg" : 9.675 },
{ "month" : "March", "avg" : 10.004 },
{ "month" : "April", "avg" : 9.983 },
{ "month" : "May", "avg" : 9.747 },
{ "month" : "June", "avg" : 9.65 },
{ "month" : "July", "avg" : 9.786 },
{ "month" : "August", "avg" : 9.617 },
{ "month" : "September", "avg" : 9.51 },
{ "month" : "October", "avg" : 10.042 },
{ "month" : "November", "avg" : 9.452 },
{ "month" : "December", "avg" : 9.86 }
]
},
{
"year" : 2019,
"type" : "odd number, can't be a leap year",
"temperatures" : [
{ "month" : "January", "avg" : 10.023 },
{ "month" : "February", "avg" : 9.808 },
{ "month" : "March", "avg" : 10.43 },
{ "month" : "April", "avg" : 10.175 },
{ "month" : "May", "avg" : 9.648 },
{ "month" : "June", "avg" : 9.686 },
{ "month" : "July", "avg" : 9.794 },
{ "month" : "August", "avg" : 9.741 },
{ "month" : "September", "avg" : 9.84 },
{ "month" : "October", "avg" : 10.15 },
{ "month" : "November", "avg" : 9.84 },
{ "month" : "December", "avg" : 10.366 }
]
}

Las siguientes secciones contienen información sobre las operaciones de proyección disponibles y cómo construirlas utilizando la clase Projections.

Utiliza el método include() para especificar la inclusión de uno o más campos.

El siguiente ejemplo incluye el campo year y (implícitamente) el campo _id:

Bson filter = Filters.empty();
Bson projection = include("year");
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018}
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}

El siguiente ejemplo incluye los campos year y type y (implícitamente) el campo _id:

Bson filter = Filters.empty();
Bson projection = include("year", "type");
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018, "type": "even number but not a leap year"}
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "type": "odd number, can't be a leap year"}

Utilice el método exclude() para especificar la exclusión de uno o más campos.

El siguiente ejemplo excluye el campo temperatures:

Bson filter = Filters.empty();
Bson projection = exclude("temperatures");
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018, "type": "even number but not a leap year"}
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "type": "odd number, can't be a leap year"}

El siguiente ejemplo excluye los campos type y temperatures:

Bson filter = Filters.empty();
Bson projection = exclude("temperatures", "type");
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018}
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}

Utiliza el método fields() para combinar varias proyecciones.

El siguiente ejemplo incluye los campos year y type y excluye el campo _id:

Bson filter = Filters.empty();
Bson projection = fields(include("year", "type"), exclude("_id"));
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"year": 2018, "type": "even number but not a leap year"}
{"year": 2019, "type": "odd number, can't be a leap year"}

Utilice el método de conveniencia excludeId() para especificar la exclusión del campo _id:

Bson filter = Filters.empty();
Bson projection = fields(include("year", "type"), excludeId());
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"year": 2018, "type": "even number but not a leap year"}
{"year": 2019, "type": "odd number, can't be a leap year"}

Utilice la elemMatch(String, Bson) variante del método para especificar una proyección de matriz que incluirá el primer elemento de una matriz que coincida con el filtro de consulta proporcionado. Este filtrado se realiza después de recuperar todos los documentos que coinciden con el filtro de consulta (si se proporciona).

Nota

Solo se incluirá el primer elemento que coincida con el filtro de consulta especificado, independientemente de cuántas coincidencias pueda haber.

El siguiente ejemplo proyecta el primer elemento del arreglo temperatures donde el campo avg es mayor que 10.1:

Bson filter = Filters.empty();
Bson projection = fields(include("year"), elemMatch("temperatures", Filters.gt("avg", 10.1)));
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018}
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "temperatures": [{"month": "March", "avg": 10.43}]}

Cuando hayas especificado los criterios de coincidencia en la parte de query de tu operación, usa la variante del método elemMatch(String) para especificar una proyección posicional para incluir el primer elemento de un arreglo. Solo se recuperarán los documentos que coincidan con el filtro de query.

Importante

En las versiones de MongoDB anteriores a la 4.4, el campo de arreglo especificado debe aparecer en el filtro de query. A partir de MongoDB 4.4, puedes usar un proyectado posicional en un campo de arreglo que no aparece en el filtro de query.

El siguiente ejemplo proyecta el primer elemento de la matriz temperatures:

Bson filter = Filters.gt("temperatures.avg", 10.1);
Bson projection = fields(include("year"), elemMatch("temperatures"));
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "temperatures": [{"month": "March", "avg": 10.43}]}

Utilice el slice() método para proyectar una porción de una matriz.

El siguiente ejemplo proyecta los primeros 6 elementos del arreglo temperatures:

Bson filter = Filters.empty();
// first half of the year
Bson projection = slice("temperatures", 6);
collection.find(filter).projection(projection)
.forEach(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build())));

El siguiente código muestra el resultado de esta proyección:

{
"_id": {
"$oid": "6042f1bc8ee6fa2a84d2be69"
},
"year": 2018,
"type": "even number but not a leap year",
"temperatures": [
... <January-June temperature nested documents>
]
}
{
"_id": {
"$oid": "6042f1bc8ee6fa2a84d2be6a"
},
"year": 2019,
"type": "odd number, can't be a leap year",
"temperatures": [
... <January-June temperature nested documents>
]
}

El siguiente ejemplo omite los primeros 6 elementos del arreglo temperatures y proyecta los siguientes 6:

Bson filter = Filters.empty();
// second half of the year
Bson projection = slice("temperatures", 6, 6);
collection.find(filter).projection(projection)
.forEach(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build())));

El siguiente código muestra el resultado de esta proyección:

{
"_id": {
"$oid": "6042f1bc8ee6fa2a84d2be69"
},
"year": 2018,
"type": "even number but not a leap year",
"temperatures": [
... <July-December temperature nested documents>
]
}
{
"_id": {
"$oid": "6042f1bc8ee6fa2a84d2be6a"
},
"year": 2019,
"type": "odd number, can't be a leap year",
"temperatures": [
... <July-December temperature nested documents>
]
}

Utiliza el metaTextScore() método para especificar una proyección de la calificación de una query de texto

El siguiente ejemplo proyecta la puntuación de texto como el valor del campo score:

Bson filter = Filters.text("even number");
Bson projection = fields(include("year"), metaTextScore("score"));
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));

El siguiente código muestra el resultado de esta proyección:

{"_id": {"$oid": "6042f1bc8ee6fa2a84d2be69"}, "year": 2018, "score": 1.25}
{"_id": {"$oid": "6042f1bc8ee6fa2a84d2be6a"}, "year": 2019, "score": 0.625}

Volver

Indexes

En esta página