Ayuda con consulta MongoDB

tOWERR

Estoy empezando a trabajar con mongoDB y me estoy volviendo loco. Tengo ahora mismo estos 2 documentos en una colección llamada 'Snozolen':

Documento 1
Documento 2

La estructura del documento se divide en propiedades, la propiedad 'questions' de cada documento contiene una colección de valores. Estos valores tienen una propiedad 'answers' que también contienen una colección de valores, y dentro de los valores de cada elemento de 'answers' hay una propiedad 'value' que tiene 3 posible valores (Bien, Regular o Mal). Quiero saber 'por documento (por el uuid del documento)' la cantidad (count) de los valores de la propiedad 'value'.

Lo he realizado mediante un group() de la colección de los documentos, lo he hecho asi:

Código group()

Me dá el siguiente error:

Error

Estoy un poco perdido en como recorrer los documentos en el reduce, porque creo que el parámetro curr contiene un objeto del documento y lo puedo recorrer mediante bucles y parece ser que no es así.
¿Alguien me puede ayudar?

Un saludo.

elkaoD

¿Por qué tanto uuid/DefUUID?

¿Por qué usas group si dices que quieres saberlo por documento? Group sirve para operar sobre agrupaciones de documentos. Si es por documento, no necesitas agrupar.

EDIT: vale entiendo que las UUIDs del documento se comparten en varios documentos (qué rallada, en MongoDB hay UUIDs y documentos también).

Creo que lo que necesitas es mapReduce.

EDIT2: providencialmente acabo de ver tu post en el hilo de MongoDB y veo que ya lo has intentado con mapReduce.

Échale de nuevo un vistazo a la documentación porque eso que pones está regulero. En el map tienes que emitir el objeto con el UUID y los valores a tomar de ese objeto (es decir, hacer la suma de cada valor).

Luego en el reduce es donde reduces (nunca mejor dicho xD) las distintas sumas de valores a una sóla.

Mira bien la docu porque tienes que hacer cosillas extra, como que la operación de reducción sea idempotente.

1 respuesta
tOWERR

#2 Lo que quiero yo conseguir es saber de cada uno de los documentos de una colección los resultados que pido, es decir:

Si la colección tiene 2 documentos, pues que me muestre una fila por cada documento con el uuid del documento y los resultados de las buenas, malas y regulares.

Mediante mapReduce conseguí algo, pero solamente me mostraba el uuid del 1º documento y los resultados de los 2 documentos de la colección. ¿Cómo consigo yo que me lo haga de cada documento, y me sume los resultados de cada documento, no me muestre el 1º documento y me sume todos los resultados de todos los documentos que hay en la colección?

Lo que te comento que conseguí lo hice con este código:

MapReduce

El resultado que me devuelve es este:

Resultado

Ahí me devuelve solamente el uuid del primer documento y me contabiliza los datos de todos los documentos, yo quiero que me muestre cada documento y me contabilice los datos de cada uno.
¿Como puedo hacer eso?

1 respuesta
tOWERR

He hecho otra consulta y me pasa lo mismo, quiero calcular las preguntas que tiene cada documento por residente. Aquí dejo el código:

MapReduce
Resultado

Me agrupa por el residente del primer documento, pero me contabiliza las questions de los 2 documentos que hay en la colección. No consigo que me lo agrupe bien. Y son distintos residentes en cada documento. ¿Cómo lo hago?

Un saludo.

elkaoD

#3 como dije, si lo quieres por documento de la colección (y no agregando UUIDs) no entiendo por qué usas group/mapReduce. Si no agrupas nada, es una consulta normal y corriente que debes agregar en el cliente.

2 respuestas
tOWERR

#5 Ya está corregido, mea culpa. Lo que yo quiero hacer, que ya lo he hecho, es agruparlo por UUID de documento.

El error le tenia (que soy tonto) que los documentos eran del mismo residente y tenían el mismo UUID. Por eso no me salía.
Perdón por las molestias, pero si que tengo que hacer un mapReduce ya que quiero contabilizar las respuestas de cada tipo que tiene cada documento. No tengo otra manera de hacer que no sea así ¿no?

tOWERR

#5 Me podrías explicar por favor, como podría sacar mediante agregación esto, por ejemplo:
Los valores 'Bien' que tiene la propiedad 'value' de la propiedad 'answers' de cada documento, o del primer documento.

Es que por más vueltas que le doy no soy capaz de sacar la forma. La única manera que lo saco es mediante mapReduce.

1 respuesta
elkaoD

#7 en el cliente. Agregación = varios documentos. Si sólo quieres un documento, no hay nada que agregar: trae el documento al cliente y haz la suma.

1 respuesta
tOWERR

#8 Mediante agregación quiero consultar los valores que tiene la propiedad 'questions' que tiene cada documento agrupado por uuid. Esto es lo que hago yo:

Aggregate

Entiendo que el sum que hago no hace nada, ¿Qué tendría que hacer para que me contabilizara los valores que contiene la propiedad questions?

1 respuesta
elkaoD

#9 con cada nuevo post me entero menos de qué quieres hacer. Eso que pones en "Aggregate" daría error de sintaxis.

Para simplificar pon un ejemplo mínimo: 2/3 documentos (con los datos mínimos que necesites) y un ejemplo del resultado que esperas.

9 días después
tOWERR

En los documentos que yo genero la estructura creo que es muy compleja a la hora de acceder a algunos datos. Por ejemplo, en el documento tiene varias propiedades "questions" y dentro de cada una de estas, dentro tiene una propiedad "answers". En la propiedad "answers" tiene varios valores, no sé si me voy explicando.

Por ejemplo, hay un "questions" y dentro de este hay un "answers" que contiene los siguientes valores: "Bien", "Mal" y "Regular". ¿Como podría yo por ejemplo, contabilizar estos valores por documento mediante un "aggregate"?

Lo que se me ha ocurrido es modificar la estructura del documento para acceder más fácilmente a los datos.

¿Qué me sugerís vosotros?

PD: La estructura de cualquier documento esta en el post #1.

1 respuesta
elkaoD

#11 como ya he dicho varias veces, si es sólo un documento a la vez se hace en el cliente y si son varios te toca mapReduce.

Usuarios habituales

  • elkaoD
  • tOWERR