Consultas costos

Consultas costos

de Eduardo David Gastelu Leivas -
Número de respuestas: 14

Unwind toma un documento con un campo arreglo y deuelve un documento para cada elemento del arreglo. Si realizo un unwind luego de haber usado previamente los documentos en un lookup o en otra función de MongoDB en el Pipeline ¿Esto tiene costo 0 o lleva algún costo? ¿Vuelve a pedir los datos del documento a la base de datos para separar el documento en varios?

Y, en general, ¿puedo asumir que el resultado de toda operación anterior no debo volver a solicitarlo? Es decir, si en un pipeline hago un lookup, y luego realizo otro lookup, ¿usar los datos del lookup anterior me generan accesos a los documentos originales en la base de datos de nuevo y con esto un costo adicional?

Pregunto porque tengo entendido que cada documento se procesa secuencialmente a través del pipeline de agregación y se accede solo una vez durante el procesamiento de las etapas, por lo que el unwind debería tener costo 0, ¿es esto así? Quiero asegurarme

Una duda más, si en project accedo, por ejemplo, a "$country.country", ¿eso cuenta como un acceso a un atributo simple o dos? ¿seria costo 0.01 o 0.02? Siento que debería contar como acceder a solamente un atributo simple y tener costo 0.01, pero de nuevo, me gustaría asegurarme.

Saludos y gracias

En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Eduardo David Gastelu Leivas -
¿Tenemos que pedir los datos de los elementos de cada arreglo en el unwind? ¿No vienen y ya forman parte de los datos que tenemos en el el pipeline al realizar el 'lookup' en la parte anterior que te genera esos arreglos en un primer lugar?
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Martin Giachino -
No se si entiendo la pregunta, pero si los objetos ya los tenías completos en memoria por un lookup (u otra operación) por lo que preguntaste en el post anterior podrías asumir que los accedes de forma rápida por estar en memoria.

Nuevamente, este tipo de detalles pueden ustedes asumir un comportamiento si es que lo creen necesario y documentarlo. Dado que harán la misma suposición para los cálculos de los dos modelos, eso hará que el supesto no invalide la comparación al final.

Martín
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Eduardo David Gastelu Leivas -
Ya que por definición la salida de un stage se convierte automáticamente en la entrada de la siguiente como se menciona aqui, debo volver a acceder a los parametros accedidos en los lookup/unwind anteriores? Lei en esta respuesta que entonces el costo de un unwind no es 0, ¿es lo que respondi debajo? Entonces, ¿qué seria la entrada que comparten los stages? ¿la consulta anterior y no los documentos con su carga útil?
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Martin Giachino -
Creo que ya respondí a esto en los mensajes de tus dos preguntas anteriores.

el pipeline comienza tomando documentos (en colecciones) que los manipula en esa stage, y genera nuevos documentos (en "colecciones" nuevas) y esos documentos generados/manipulados son la entrada de la siguiente stage y así sucesivamente. En cada etapa eventualmente puedo sumar alguna nueva colección que antes no fue usada a la "colecció resultado parcial" que llevamos computada. En el caso que el unwind tome cosas en memoria será 0.01 pero no cero.

Martín
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Martin Giachino -
No está mal si asumís que luego de acceder por primera vez a los objetos de una colección, esos objetos intermedios que se generan en colecciones intermedias van quedando en memoria. En ese caso no sería costo cero, sino que al menos estaría bien contarlos como un acceso rápido 0.01.

Para tu segunda pregunta, y si hablamos de un objeto que ya está en memoria tendrías 2 accesos rápidos.

Pero insisto, esto de los costos es un modelo de costos ficticio de referencia para hacer un cálculo en 2 modelos (DD1 y DD2) y luego compararlos. No implica que sean reales en la implementación de mongoDB.

Martín
En respuesta a Martin Giachino

Re: Consultas costos

de Eduardo David Gastelu Leivas -
Profesor, en este ejemplo, en el segundo $lookup, el acceder al localField 'B.c_id', ¿serían dos accesos rápidos tambien?

pipeline = [
# Join with address collection
{
'$lookup': {
'from': 'B',
'localField': 'b_id',
'foreignField': 'b_id',
'as': 'B'
}
},
# Unwind the B array
{'$unwind': '$B'},
# Join with city collection
{
'$lookup': {
'from': 'C',
'localField': 'B.c_id',
'foreignField': 'c_id',
'as': 'C'
}
}

(...)
]

# Execute the pipeline and print the result
result = db.A.aggregate(pipeline)

df = pd.DataFrame(list(result))
df



Luego, ¿tiene sentido decir que luego de un unwind a la colección 'A' la colección resultante tendrá tamaño "tamañoColeccionAnterior*promedioArregloA"?
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Martin Giachino -
Para la primer pregunta diría que sí, el acceso a B.c_id en el segundo lookup debería ser un acceso rápido porque es sobre el resultado de la operación anterior.

Pero el unwind está sobre sobre el resultado del lookup de A y B, ¿no? en ese caso tendrías una colección cuyo tamaño es el producto de ambas (suponiendo claro que esos id's con únicos).
En respuesta a Martin Giachino

Re: Consultas costos

de Eduardo David Gastelu Leivas -

La segunda respuesta me genera dudas, en un lookup, si los id's son unicos, se me agregaría un campo a cada documento arreglos de tamaño 1 indice en la colección de la izquierda, al hacer luego unwind para desarmar esos arreglos de tamaño 1, ¿no seguiré teniendo la misma cantidad de documentos? ¿Con el producto de ambas se refiere al tamaño que ocupa en memoria y no a la cantidad de documentos? Al escribir que me quedarían "tamañoColeccionAnterior*promedioArregloA" me quería referir a la cantidad de documentos resultante del unwind, ya que si, por ejemplo, el tamaño promedio de los arreglos fuera 2, el unwind al separarme esos arreglos de 2 índices en 2 documentos separados, me duplicaría la cantidad de documentos que tenia la colección antes, preguntaba porque me parece algo que debo tener en cuenta para futuras recorridas de los documentos resultantes del unwind para calcular los 'costos grandes' de recorrer todos los índices la colección resultante, no me refería al tamaño que ocupa de almacenamiento, que la colección en almacenamiento si ocuparía como tamaño el producto de ambas. ¿Esto es así?

En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Eduardo David Gastelu Leivas -
Un group que trabaja con la colección de documentos resultante de etapas anteriores no tiene por qué hacer 'costos caros' ¿verdad? solo accede y agrupa a elementos de stages previas con costo 0.01, no necesita volver a pedir los documentos con "costos grandes" 1, ¿es esto asi?
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Eduardo David Gastelu Leivas -
No estoy seguro si en group está bien sumar costo 1 por acceder a cada uno de los documentos que vamos a agrupar, yo tenia en mente que uso la colección de documentos resultante del stage anterior que deseo agrupar, y no existe el 'debo acceder a cada documento en el group entonces costo 1 por cada documento', sino solamente acceder a los atributos simples con costo 0.01, ¿es correcto?
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Martin Giachino -
Si es resultado del stage anterior y están "en memoria" entonces podés pensar que son accesos rápidos.

Martín
En respuesta a Eduardo David Gastelu Leivas

Re: Consultas costos

de Martin Giachino -
La cantidad de documentos que resultan de un lookup dependerá de la cardinalidad que tenga el x_id en la tabla "de la derecha".

Si es único, entonces en cantidad de documetnos serán los mismos que la colección de la derecha, y el tamaño en memoria sí se sumaría.

Si no es único y cada valor de esos selecciona promedioArregloA elementos en la derecha, entonces el tamaño sería "tamañoColeccionAnterior*promedioArregloA"