Consulta en Mongodb (duda)

90 views
Skip to first unread message

Porlaotracara

unread,
Sep 8, 2014, 11:41:51 AM9/8/14
to mongod...@googlegroups.com
Hola,

Tengo una colección con miles de documentos. Cada documento tiene 5 campos (_id, nombre, evento, fecha_evento, comentario)

El único campo que tiene valor único asociado a nombre y evento es el de fecha_evento. Todos los demás pueden repetirse miles de veces.

Hice una consulta para identificar que nombres tienen evento = A. 

Del resultado que obtengo, ahora quiero hacer otra consulta que me muestre para esos nombres (solo para esos nombres) todos los documentos. ¿Puedo hacer una consulta en Mongo para llamar a la anterior?

Si no fuera así y me pasaran un listado de 500 nombres y yo tuviera que hacer una consulta sobre esa base de datos con esos 500 nombres. ¿Cómo podría hacerlo?

Muchas gracias.


Fernando

unread,
Sep 8, 2014, 3:47:08 PM9/8/14
to mongod...@googlegroups.com
Hola,
no se si entendí muy bien tu problema, pero creo que podrías usar el operador $in, una vez que tengas todos los nombres que quieras buscar.

De esta forma: { field: { $in: [<value1>, <value2>, ... <valueN> ] } }

Cada value es un elemento de tu lista con nombres, algo así:
db.collection.find({ nombre: { $in: ['nombreEvento1', 'nombreEvento2']});

Puedes encontrar más información aquí: http://docs.mongodb.org/manual/reference/operator/query/in/

Saludos

Porlaotracara

unread,
Sep 9, 2014, 3:40:28 AM9/9/14
to mongod...@googlegroups.com
Hola Fernando,

Creo que podría funcionar, pero ¿tengo que escribir dentro de cada <value..> los nombres uno a uno?? 

Gracias.

Fernando

unread,
Sep 9, 2014, 9:11:47 PM9/9/14
to mongod...@googlegroups.com
Hola,
si ya hiciste un query filtrando los documentos con evento = A, ya tienes todos los datos de esos documento.
No sería necesario hacer un segundo query.

O hay algún otro dato que no he entendido bien?

Otra pregunta para entender más el contexto ¿Estas usando mongo con algún lenguaje de programación o estás usando la shell para hacer consultas?

Saludos

Porlaotracara

unread,
Sep 10, 2014, 10:23:51 AM9/10/14
to mongod...@googlegroups.com
Hola Fernando, 

Estoy usando la shell para hacer las consultas.

Hago una primera consulta para saber qué nombres tienen evento = A (En la colección hay millones de documentos, los nombres se repiten cientos de veces y están asociados a múltiples eventos). Pero una vez que sé qué nombres tienen evento = A. Tengo que hacer otra consulta sobre la misma colección diciéndole que me de todos los documentos asociados a esos nombres independientemente de si el evento es A, B o C. 

En tu respuesta había entendido que una vez que tenía ese listado de nombres tenía que escribirlos uno a uno aquí:

{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }

Muchas gracias.

Fernando

unread,
Sep 10, 2014, 11:39:31 AM9/10/14
to mongod...@googlegroups.com
Hola,

no tienes que escribirlos 1 por 1,puedes usar javascript en la shell de Mongo.
Pon estas lineas lineas en tu shell, ejecútalas por separado, pero en orden.

var nombresNoRepetidos = db.tucollection.distinct( 'nombre', { evento: 'A' } );
var documentos = db.tucollection.find({ nombre: { $in: nombresNoRepetidos }});
documentos

La primera linea pone en tu variable "nombresNoRepetidos" un array de nombres ( no repetidos ) de los documentos que tienen evento A, puedes ver más información aquí: http://docs.mongodb.org/manual/reference/method/db.collection.distinct/

La segunda linea usa el operador $in que te comenté antes, para obtener todos los documentos que tienen esos nombres que obtuviste en la primera linea.

Y la tercera línea imprime en consola los documentos que obtuviste en la segunda linea.

Espero que te haya servido,

Saludos,


Porlaotracara

unread,
Sep 11, 2014, 4:20:32 AM9/11/14
to mongod...@googlegroups.com
Muchísimas gracias Fernando!!! 
Con esto ya me quedó claro :)

Porlaotracara

unread,
Sep 15, 2014, 7:25:34 AM9/15/14
to mongod...@googlegroups.com
Hola Fernando,

Quería hacerte una última consulta. Lo que me indicaste funciona a las mil maravillas desde la Shell de mongo. Pero he empezado a usar Spoon (Pentaho) como medio para traerme datos desde mongodb y analizarlos. En el editor de Spoon solo se cómo traerme una colección desde mongodb, pero no cómo ejecutar línea a línea lo que me indicas, la verdad es que la forma de escribir el código cambia un poco. Si en vez de escribir "documentos" para que se muestre el resultado en pantalla, tuviese que crear una nueva colección a raiz de ese resultado, podría hacerlo con db.createCollection o db.nuevacoleccion.insert? 

Gracias

El miércoles, 10 de septiembre de 2014 17:39:31 UTC+2, Fernando escribió:

Fernando

unread,
Sep 15, 2014, 10:41:10 AM9/15/14
to mongod...@googlegroups.com
Hola, no he usado Spoon, aunque si he usado Robomongo, y efectivamente hay cosas que se muestran distinto a lo que muestra la shell.

Sobre crear una collección, el comando db.nuevacollection.insert debería crear la collección si es que no existe, con eso no creo que haya problemas.

Saludos

Porlaotracara

unread,
Sep 16, 2014, 3:24:42 AM9/16/14
to mongod...@googlegroups.com
Lo intenté, en vez de escribir directamente - documentos - para que se muestre el resultado en pantalla. Puse db.nuevacollection.insert ({documentos}) y no reconoce la sentencia. En fin! No se de qué otro modo podría hacerse.

Fernando

unread,
Sep 19, 2014, 11:52:47 AM9/19/14
to mongod...@googlegroups.com
Hola, has intentado poner documentos sin las llaves {} ? Recuerda que documentos es una array, puede estar dando error de sintaxis.


Saludos,

El martes, 16 de septiembre de 2014 02:24:42 UTC-5, su escribió:
Lo intenté. en vez de escribir directamente - documentos - para que se muestre el resultado en pantalla. Puse db.nuevacollection.insert ({documentos}) y no reconoce la sentencia. En fin! No se de qué otro modo podría hacerse.
Reply all
Reply to author
Forward
0 new messages