Overview
En esta guía, aprenderá cómo especificar proyecciones utilizando constructores en el controlador Java Reactive Streams.
MongoDB admite la proyección de campos, especificando qué campos se deben incluir y excluir al devolver resultados de una query. La proyección en MongoDB sigue algunas reglas básicas:
El campo
_idse incluye siempre a menos que se excluya explícitamenteEspecificar un campo para inclusión excluye implícitamente todos los demás campos excepto el campo
_idEspecificar un campo para su exclusión elimina solo ese campo en un resultado de query
Para obtener más información sobre la mecánica de proyección, consulte el tutorial "Proyectar campos a partir de resultados de consulta" en el manual.
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 mayor brevedad, puede optar por importar los métodos de la clase Projections de forma estática:
import static com.mongodb.client.model.Projections.*;
Los siguientes ejemplos asumen esta importación estática.
Documentos de muestra y ejemplos
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 promedio mensuales en Celsius de 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 } ] }
Operaciones de proyección
Las siguientes secciones contienen información sobre las operaciones de proyección disponibles y sobre cómo construirlas usando la clase Projections.
Inclusión
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"); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}
El siguiente ejemplo incluye los campos year, type e implícitamente el campo _id:
Bson filter = Filters.empty(); Bson projection = include("year", "type"); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_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"}
Exclusion
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"); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_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"); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}
Combinando proyecciones
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")); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"year": 2018, "type": "even number but not a leap year"} {"year": 2019, "type": "odd number, can't be a leap year"}
Exclusión de _id
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()); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"year": 2018, "type": "even number but not a leap year"} {"year": 2019, "type": "odd number, can't be a leap year"}
Proyecto con coincidencia de elemento de arreglo
Utilice la variante del método elemMatch(String, Bson) para especificar una proyección de arreglo que incluya el primer elemento de un arreglo que coincida con un filtro de query suministrado. Esta filtración se produce después de que se hayan recuperado 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 query especificado, independientemente de cuántas coincidencias haya.
El siguiente ejemplo proyecta el primer elemento del array 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))); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_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 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 utilizar un Proyecto posicional en un campo de arreglo que no aparece en el filtro de query.
El siguiente ejemplo proyecta el primer elemento del arreglo temperatures:
Bson filter = Filters.gt("temperatures.avg", 10.1); Bson projection = fields(include("year"), elemMatch("temperatures")); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "temperatures": [{"month": "March", "avg": 10.43}]}
Proyectar una porción de arreglo
Utilice el método slice() para proyectar una porción de un arreglo.
El siguiente ejemplo proyecta los primeros 6 elementos del arreglo temperatures:
Bson filter = Filters.empty(); Bson projection = slice("temperatures", 6); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build()))) .blockLast();
{ "_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(); Bson projection = slice("temperatures", 6, 6); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build()))) .blockLast();
{ "_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> ] }
Proyectar la puntuación de texto
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")); FindPublisher<Document> findPublisher = collection.find(filter).projection(projection); Flux.from(findPublisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_id": {"$oid": "6042f1bc8ee6fa2a84d2be69"}, "year": 2018, "score": 1.25} {"_id": {"$oid": "6042f1bc8ee6fa2a84d2be6a"}, "year": 2019, "score": 0.625}