Docs Menu
Docs Home
/ /

Especifica qué campos se deben devolver

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

Muchas solicitudes de lectura solo requieren un subconjunto de campos en un documento. Por ejemplo, al iniciar sesión, es posible que solo necesite su nombre de usuario y no toda la información de su perfil. De forma predeterminada, las consultas en MongoDB devuelven todos los campos de los documentos coincidentes. Puede usar una proyección para devolver solo los datos necesarios.

Una proyección es un documento que indica a MongoDB qué campos de un documento devolver. Utilice el Clase deproyecciones para construir un documento de proyección.

Las proyecciones funcionan de dos maneras:

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

  • Exclusión implícita de campos. 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 incluye campos explícitamente, no puede excluirlos explícitamente, y viceversa.

Importante

El _id El campo no está sujeto a estas mecánicas. Debe excluir explícitamente el _id campo si no desea que se devuelva. Puede excluir el _id campo incluso si ha especificado la inclusión de ciertos campos.

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 },

Estos datos se modelan utilizando la siguiente clase de datos Kotlin:

data class Fruit(
@BsonId val id: Int,
val name: String,
val qty: Int,
val rating: Int
)

En la siguiente consulta, pase la proyección para devolver el campo name de cada documento. Los resultados se modelan utilizando la clase de datos FruitName de Kotlin:

data class FruitName(
@BsonId val id: Int? = null,
val name: String
)
// Return all documents with only the name field
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitName::name.name)
)
val flowResults = collection.find<FruitName>(filter).projection(projection)
flowResults.collect { println(it)}
FruitName(id=1, name=apples),
FruitName(id=2, name=bananas),
FruitName(id=3, name=oranges),
FruitName(id=4, name=avocados)

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. Encadenar esta proyección a find() con un filtro de query vacío arroja los resultados anteriores.

A pesar de que esta proyección solo incluyó explícitamente el campo name, la consulta también devolvió el campo _id, representado por id en la clase de datos.

El campo _id es un caso especial: siempre se incluye en todos los resultados de la consulta, 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 crear consultas.

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

data class FruitName(
@BsonId val id: Int? = null,
val name: String
)
// Return all documents with *only* the name field
// excludes the id
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitName::name.name),
Projections.excludeId()
)
val flowResults = collection.find<FruitName>(filter).projection(projection)
flowResults.collect { println(it)}
FruitName(name=apples),
FruitName(name=bananas),
FruitName(name=oranges),
FruitName(name=avocados)

El documento de proyección especifica que el resultado de la operación de lectura debe incluir el name campo de cada documento devuelto y especifica que se excluya el _id campo. Por lo tanto, esta proyección excluye implícitamente los qty rating campos y. Al encadenar esta proyección a find() con un filtro de consulta vacío, se obtienen los resultados anteriores.

También puede especificar varios campos para incluir en su proyección.

Tip

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

Este ejemplo que identifica dos campos para incluir en la proyección produce los siguientes resultados utilizando la clase de datos Kotlin FruitRating:

data class FruitRating(
val name: String,
val rating: Int
)
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitRating::name.name, FruitRating::rating.name),
Projections.excludeId()
)
val flowResults = collection.find<FruitRating>(filter).projection(projection)
flowResults.collect { println(it)}
FruitRating(name=apples, rating=3),
FruitRating(name=bananas, rating=1),
FruitRating(name=oranges, rating=2),
FruitRating(name=avocados, rating=5)

Para obtener ejemplos de proyección adicionales, consulte la Página del manual de MongoDB sobre los campos del proyecto que se devolverán de la consulta.

Volver

Especifica los documentos a devolver

En esta página