Translate

viernes, 14 de junio de 2013

MongoDB: Hacer una query sobre campos del propio documento

La problemática de hoy surge porque me he visto en la necesidad de ver si dos campos de un mismo documento de mongoDb son iguales.

Para ello lo que necesito es hacer una query buscando el contenido de uno de los campos del documento en otro.

En mi caso tengo que recuperar los documentos de la tabla de usuarios donde el username sea igual a email de contacto.

{
  "_id" : "6006491b-04cc-45be-82cb-5612395d2d10",
  "username" : "xxxx@xxx.com",
  "password" : "xxxxxxx",
  "name" : "Manuel",
  "surname" : "Roberto Del Pino",
  "email" : "xxxx@xxx.com",
  "dni" : "",
  "phone" : "",
  "creationDate" : ISODate("2013-02-15T12:22:29.476Z"),
  "activated" : true,
  "deleted" : false,
  "address" : "",
  "city" : "",
  "province" : "",
  "postalCode" : "",
  "country" : "",
  "activationDate" : ISODate("2013-02-15T12:22:29.476Z")
}

Para ello se puede utilizar la siguiente query usando la clausila $where con una instrucción en javascript.

 {$where:"this.email == this.username"}

El resultado de la ejecución será más lento de lo habitual porque en motor de javascript entra en funcionamiento.

No es recomendable para coleccione con muchos documentos.

Referencia:
Mongodb query with fields in the same documents

viernes, 17 de mayo de 2013

SpringData MondoDb: Configuración de conexiones PRODUCCION

Establecemos los valores de la conexión de SpringData para MongoDb en producción basándonos en el siguiente artículo encontrado en StackOverflow: How to configure MongoDB Java driver MongoOptions for production use?

auto-connect-retry="true" : para que el servidor se reconecte se pierde la conexión.

connections-per-host="40"  :  Conexiones que tendrá nuestra aplicación, son la que va a establecer del driver de java para esta aplicación.

connectTimeout = "30000": El el tiempo que espera el servidor antes de abortar un intento de conexión con la base de datos. O sea es el tiempo que espera para conseguir una conexión libre. Debe de ser algo grande entre 15 y 30 segundos para que sea realista según recomiendan.

socketTimeout="60000" : Una vez iniciada un operación de lectura, es tiempo que el socket va  a esperar la respuesta, si se supera podremos tener errores del tipo:

--
Caused by: com.mongodb.MongoException$Network: can't say something
 at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:194)
 at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:155)
 at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:349)
 at com.mongodb.DBCollection.update(DBCollection.java:177)
 at com.mongodb.DBCollection.save(DBCollection.java:817)
 at com.mongodb.DBCollection.save(DBCollection.java:785)
 at org.springframework.data.mongodb.core.MongoTemplate$10.doInCollection(MongoTemplate.java:885)
 at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:388)

Caused by: java.net.SocketTimeoutException: Read timed out
 at java.net.SocketInputStream.socketRead0(Native Method)
 at java.net.SocketInputStream.read(SocketInputStream.java:150)
 at java.net.SocketInputStream.read(SocketInputStream.java:121)
 at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
 at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
 at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
 at org.bson.io.Bits.readFully(Bits.java:46)
--

Referencia útil: connectionTimeout VS SocketTimeout

maxWaitTime = "1500" : Milisegundos que un hilo esperará  para conseguir una conexión libre del pool de conexiones.

Aquí os dejo la configuración que por ahora nos funciona correctamente.
--
<mongo:mongo host="xxx.xxx.xxx" port="xx" id="mongo">
   <mongo:options connections-per-host="40"
            threads-allowed-to-block-for-connection-multiplier="1500"
            connect-timeout="30000"
            max-wait-time="1500"
            auto-connect-retry="true"
            socket-keep-alive="true"
            socket-timeout="60000"
            slave-ok="true"
            write-number="1"
            write-timeout="0"
            write-fsync="true"/>
</mongo:mongo>

--

jueves, 9 de mayo de 2013

Instalación de MongoDb en Windows 7


En este rápido post vamos a ver como se instala de una manera muy fácil MongoDB en nuestro sistemas Windows.

1 - Para hacerlo lo que necesitamos es descargar MongoDB a nuestra ordenador e instalarlo (o descompromirlo) según la versión que utilicemos aquí podemos encontrarlo el paquete de descarga.

Dependiendo del sistema operativo que utilicemos descargaremos una u otra en mi caso con Windows 7



2 - Descomprimimos el zip en la ruta que queramos, en mi caso lo he puesto c: de tal modo que el directorio de instalación es C:\mongodb-win32-2.4.1

3 - Debemos de crear un directorio para guardar los archivos de base de datos, la documentación nos da un directorio de instalación por defecto que es c:\data\db. Podemos crearlo o establecer uno distinto en los parámetros de arranque de mongo con la opción --dbpath

Yo prefiero definir el directorio dentro de la propia carpeta de instalación por lo tanto  creo la siguiente ruta de directorios

C:\mongodb-win32-2.4.1\data\db

4  - Creación del script de arranque:  Para no tener que estar poniendo el comando de arranque todo el tiempo creo un archivo start_mongo.bat dentro del directorio bin, con el siguiente código:


mongod.exe --dbpath ..\data\db

5 - Arrancamos mongo: Ejecutamos el script de arranque pulsando sobre nuestro archivo .bat o desde una ventana de commando de windows y desde el directorio bin escribimos el código del punto 4.


Ya tenemos arrancada nuestra base de datos.

6 - Ahora arrancamos la Shell de MongoDB para poder operar con la base de datos.

Desde una nueva ventana de comandos accdemos al direcorio bin y ejecutamos:

mongo.exe




Ya podemos operar con nuestra base de datos en LOCAL.

Para operar podemos ver las base de datos que tenemos disponibles:

show dbs

y seleccionamos la base de datos que deseemos con el comando user.

use test

Una vez seleccionada la base de datos ya podemos insertar registros

db.test.save({a:1})

y recuperarlos:

db.test.find()




Ya tenemos la base de datos lista para operar.