Overview
En esta guía, puedes aprender cómo interactuar con bases de datos y colecciones de MongoDB utilizando el controlador de Scala.
MongoDB organiza los datos en una jerarquía de los siguientes niveles:
Bases de datos: Estructuras de datos de nivel superior en una implementación de MongoDB que almacenan colecciones.
Colecciones: Grupos de documentos de MongoDB. Son análogos a las tablas en bases de datos relacionales.
Documentos: Unidades que almacenan datos literales como cadenas, números, fechas y otros documentos incrustados. Para obtener más información sobre los tipos de campos de documentos y la estructura, consulta la guía Documentos en el manual de MongoDB Server.
Acceder a una base de datos
Accede a una base de datos llamando al método getDatabase() en una instancia de MongoClient.
El siguiente ejemplo accede a una base de datos llamada "test_database":
val database = mongoClient.getDatabase("test_database")
Acceder a una colección
Accede a una colección llamando al método getCollection() en una instancia de MongoDatabase.
El siguiente ejemplo accede a una colección llamada "test_collection":
val collection = database.getCollection("test_collection")
Tip
Si el nombre de la colección proporcionado aún no existe en la base de datos, MongoDB crea implícitamente la colección cuando se insertan datos en ella por primera vez.
Crear una colección
Utiliza el método createCollection() en una instancia MongoDatabase para crear explícitamente una colección en una base de datos.
El siguiente ejemplo crea una colección llamada "example_collection":
val createObservable = database.createCollection("example_collection") Await.result(createObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
Puedes especificar las opciones de la colección, como el tamaño máximo y las reglas de validación de documentos, pasando una instancia de CreateCollectionOptions al método createCollection(). Para obtener una lista completa de parámetros opcionales, consulte la documentación del comando create en el manual del MongoDB Server.
Obtén una lista de colecciones
Puedes solicitar una lista de colecciones en una base de datos llamando al método listCollections() de una instancia MongoDatabase.
El siguiente ejemplo enumera todas las colecciones en una base de datos:
val results = Await.result(database.listCollections().toFuture(), Duration(10, TimeUnit.SECONDS)) results.foreach(println)
Iterable((name,BsonString{value='test_collection'}), (type,BsonString{value='collection'}), ... ) Iterable((name,BsonString{value='example_collection'}), (type,BsonString{value='collection'}), ... )
Para hacer un query para solo los nombres de las colecciones en la base de datos, lleva a cabo el método listCollectionNames() de la siguiente manera:
val results = Await.result(database.listCollectionNames().toFuture(), Duration(10, TimeUnit.SECONDS)) results.foreach(println)
test_collection example_collection
Tip
Para obtener más información acerca de cómo iterar sobre una instancia de Future, consulta Usar futuros para recuperar todos los resultados en la guía Acceder a datos de un Observable.
Borrar una colección
Puedes borrar una colección llamando al método drop() en una instancia de MongoCollection.
El siguiente ejemplo elimina la colección test_collection:
val deleteObservable = database.getCollection("test_collection").drop() Await.result(deleteObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
Advertencia
Eliminar una colección borra todos los datos de la colección
Borrar una colección de la base de datos borra permanentemente todos los documentos y todos los índices dentro de esa colección.
Descartar una colección solo si los datos que contiene ya no son necesarios.
Borrar una base de datos
Puedes borrar una base de datos llamando al método drop() en una instancia MongoDatabase.
El siguiente ejemplo borra la base de datos test_database:
var database = mongoClient.getDatabase("test_database") val deleteObservable = database.drop() Await.result(deleteObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
Advertencia
Borrar una base de datos borra todos los datos de la base de datos.
Borrar una base de datos borra permanentemente todas las colecciones, documentos e índices dentro de esa base de datos.
Descarta una base de datos solo si ya no necesitas sus datos.
Configurar operaciones de lectura y guardar
Puedes controlar cómo el driver direcciona las operaciones de lectura configurando una preferencia de lectura. También puede controlar las opciones de cómo el driver espera la confirmación de las operaciones de lectura y escritura en un set de réplicas configurando un nivel de consistencia de lectura y un nivel de confirmación de escritura (write concern).
Por defecto, las bases de datos heredan estas configuraciones de la instancia de MongoClient, y las colecciones las heredan de la base de datos. Sin embargo, puedes cambiar estos ajustes en tu base de datos utilizando el método withReadPreference().
El siguiente ejemplo accede a una base de datos mientras especifica la preferencia de lectura de la base de datos como secondary:
val databaseWithReadPrefs = mongoClient.getDatabase("test_database").withReadPreference(ReadPreference.secondary())
También se pueden cambiar los ajustes de lectura y escritura de las colecciones utilizando el método withReadPreference(). El siguiente ejemplo muestra cómo acceder a una colección especificando la preferencia de lectura de la colección como secondary:
val collectionWithReadPrefs = database.getCollection("test_collection").withReadPreference(ReadPreference.secondary())
Tip
Para ver los tipos de preferencias de lectura disponibles, consulta la documentación de la API.
Para obtener más información sobre la configuración de lectura y escritura, consulta las siguientes guías en el manual del servidor MongoDB:
Conjuntos de etiquetas
En el MongoDB Server, puedes aplicar etiquetas clave-valor a los miembros del conjunto de réplicas según los criterios que elijas. Luego, puede usar esas etiquetas para dirigir una operación de lectura a uno o más nodos.
Por defecto, el driver de Scala ignora las etiquetas al elegir un nodo del que leer. Para indicar al controlador de Scala que prefiera ciertas etiquetas, pase una instancia de TagSet al constructor de ReadPreference, luego pase la instancia de ReadPreference al MongoClientSettings que se utiliza para crear una instancia de MongoClient.
En el siguiente ejemplo de código, el conjunto de etiquetas que se pasa al constructor ReadPreference indica al driver de Scala que dé preferencia a las lecturas desde el centro de datos de Nueva York ('dc': 'ny') y que recurra al centro de datos de San Francisco ('dc': 'sf'):
val tag1 = new Tag("dc", "ny") val tag2 = new Tag("dc", "sf") val tagSet = new TagSet(List(tag1, tag2).asJava) val connectionString = ConnectionString("<connection string URI>") val readPreference = ReadPreference.primaryPreferred(tagSet) val mongoClientSettings = MongoClientSettings.builder() .applyConnectionString(connectionString) .readPreference(readPreference) .build() val clientWithTags = MongoClient(mongoClientSettings)
Umbral local
Cuando se conecta a un set de réplicas con una preferencia de lectura que no es primaria, el driver lee del miembro elegible más cercano del set de réplicas dentro de la ventana de latencia. Al conectarse a un clúster fragmentado, el controlador selecciona entre todas las instancias mongos accesibles dentro de la ventana de latencia. Para aprender sobre los modos de preferencia de lectura, consulte Preferencia de lectura.
Por defecto, el controlador utiliza únicamente los servidores cuyos tiempos de ping se encuentren dentro de 15 milisegundos del servidor elegible más cercano.
Por ejemplo, supongamos que su set de réplicas tiene cinco nodos y el nodo más cercano tiene un tiempo de ping de 5 milisegundos. Con el valor por defecto de localThresholdMS de 15 milisegundos, solo los nodos con un tiempo de ping de 20 milisegundos o menos están dentro de la ventana de latencia, como se muestra en la tabla siguiente:
host | Tipo | Tiempo de ping | Dentro de la Ventana de Latencia |
|---|---|---|---|
| Primario | 5ms | Sí |
| secundario | 9ms | Sí |
| secundario | 13ms | Sí |
| secundario | 24ms | No |
| secundario | 42ms | No |
Para ajustar la ventana de latencia, utiliza el método localThreshold() dentro del bloque ClusterSettings.Builder que proporciona el método applyToClusterSettings() de la clase MongoClientSettings.Builder. Alternativamente, incluye el parámetro localThresholdMS en tu URI de cadena de conexión.
El siguiente ejemplo se conecta a una implementación de MongoDB que se ejecuta en localhost:27017 y especifica un umbral local de 35 milisegundos:
val connectionString = ConnectionString("mongodb://localhost:27017") val mongoClientSettings = MongoClientSettings.builder() .applyConnectionString(connectionString) .applyToClusterSettings(builder => builder.localThreshold(35, TimeUnit.MILLISECONDS)) .build() val client = MongoClient(mongoClientSettings)
En el ejemplo anterior, el driver de Scala distribuye las lecturas entre los nodos coincidentes dentro de 35 milisegundos del tiempo de ping del nodo más cercano.
Documentación de la API
Para aprender más sobre cualquiera de los tipos o métodos discutidos en esta guía, consulta la siguiente documentación de la API: