Overview
En esta guÃa, puedes aprender a usar el controlador de Streams Reactivos de Java para especificar qué campos devolver de una operación de lectura. Puedes seleccionar estos campos utilizando una proyección, un documento que especifica qué campos devuelve MongoDB de una query.
Datos de muestra
Los ejemplos de esta guÃa utilizan la colección sample_restaurants.restaurants de los conjuntos de datos de ejemplo de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de ejemplo, consulte la guÃa de introducción.
Importante
Proyecto Reactor librerÃa
Esta guÃa utiliza la biblioteca Project Reactor para consumir instancias Publisher devueltas por los métodos del controlador Java Reactive Streams. Para obtener más información sobre la biblioteca Project Reactor y cómo usarla, consulte la sección "Primeros pasos" en la documentación de Reactor. Para obtener más información sobre cómo utilizamos los métodos de la biblioteca Project Reactor en esta guÃa, consulte la guÃa "Escribir datos en MongoDB".
Tipos de proyección
Se puede usar una proyección para especificar qué campos incluir y excluir de los documentos recuperados. Por defecto, al incluir ciertos campos se excluyen todos los demás campos, por lo que no se pueden combinar instrucciones de inclusión y exclusión en una sola proyección, a menos que se excluya el campo _id de los resultados.
Especifica los campos que deseas incluir
Utilice la siguiente sintaxis para especificar los campos que se incluirán en el resultado de una operación de lectura:
projection(fields(include("<field name>")))
Para usar una proyección, pasa un filtro de query al método find(). Luego, encadene el método projection() a la llamada al método find().
El siguiente ejemplo utiliza el método find() para recuperar documentos en los que el valor del campo name es "Emerald Pub". Luego utiliza una proyección para incluir únicamente los campos name, cuisine y borough de los documentos devueltos.
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(include("name", "cuisine", "borough"))); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'} {'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}
Cuando se utiliza una proyección para especificar los campos que se incluirán en el documento de respuesta, el campo _id también se incluye de forma predeterminada. Todos los demás campos se excluyen implÃcitamente. Para omitir el campo _id de los documentos de respuesta, debe excluirlo explÃcitamente.
Excluir el campo _id
Puedes excluir el campo _id de los documentos devueltos utilizando el método excludeId().
El siguiente ejemplo realiza la misma query que en el ejemplo anterior, pero también excluye el campo _id en los documentos devueltos:
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(include("name", "cuisine", "borough"), excludeId())); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'} {'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}
Especificar campos a excluir
Utiliza la siguiente sintaxis para especificar los campos que deben excluirse del resultado de una operación de lectura:
projection(fields(exclude("<field name>")))
Para usar una proyección, pasa un filtro de query al método find(). Luego, encadene el método projection() a la llamada al método find().
El siguiente ejemplo utiliza el método find() para encontrar todos los restaurantes en los que el valor del campo name es "Emerald Pub". Luego utiliza una proyección para excluir los campos grades y address de los documentos devueltos.
FindPublisher<Document> findProjectionPublisher = restaurants.find( eq("name", "Emerald Pub")) .projection(fields(exclude("grades", "address"))); Flux.from(findProjectionPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40367329'} {'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40668598'}
Cuando se utiliza una proyección para especificar qué campos deben excluirse, cualquier campo no especificado se incluye implÃcitamente en el documento de retorno.
Errores de proyección
La siguiente sección describe un error que puede encontrar al utilizar proyecciones.
Error de inclusión y exclusión
El controlador devuelve lo siguiente si se intenta incluir y excluir campos en una sola proyección:
OperationFailure: ... Cannot Do Exclusion on Field <field> in Inclusion Projection
Para solucionar este error, asegúrate de que tu proyección especifique solo campos a incluir o solo campos a excluir.
Información Adicional
Para obtener más información sobre las proyecciones, consulte la guÃa Campos de proyecto en el manual del servidor MongoDB.
Documentación de la API
Para obtener más información sobre cualquiera de los métodos o tipos discutidos en esta guÃa, consultar la siguiente documentación de la API: