/ / MongoDB Project / Aggregate para obtener todos los documentos secundarios de las últimas entradas de arreglos - mongodb, mongodb-query, aggregation-framework

MongoDB Project / Aggregate para obtener todos los documentos secundarios de las últimas matrices de entradas: mongodb, mongodb-query, aggregation-framework

Utilizo MongoDB para almacenar datos de series de tiempo con huecos. Cada documento pertenece a un elemento y contiene los cambios para varios puntos de medición. Cada punto de medida tiene una identificación, usé el siguiente esquema de identificación some-id-XXX en el siguiente ejemplo.

La aplicación escribe solo los cambios en elSub documento específico. Por lo tanto, existe la posibilidad de que haya brechas en la serie en la que la aplicación carga todo el documento; verifica si hay cambios y actualiza el (los) documento (s)"some-id-1" por ejemplo) que tiene cambios.

{
"_id": "XXX-DAY_OF_YEAR",
"date": null /* A date used for the TTL index */,
"series" : {
"some-id-1" : [
{
"ts" : 1457959837,
"value" : 385,
"meta" : "some meta info …"
},
{
"ts" : 1457959837,
"value" : 385,
"meta" : "some meta info …"
},
{
"ts" : 1458286255,
"value" : 380,
"meta" : "some meta info …"
},
{
"ts" : 1458346606,
"value" : 375,
"meta" : "some meta info …"
},
{
"ts" : 1458381111,
"value" : 368,
"meta" : "some meta info …"
},
{
"ts" : 1458381461,
"value" : 365,
"meta" : "some meta info …"
},
{
"ts" : 1458606338,
"value" : 385,
"meta" : "some meta info …"
},
{
"ts" : 1458606338,
"expired": true
}
],
"some-id-2" : [
{
"ts" : 1439802083,
"value" : 430,
"meta" : "some meta info …"
}
],
"some-id-42" : [
{
"ts" : 1457545167,
"value" : 518,
"meta" : "some meta info …"
},
{
"ts" : 1458483441,
"value" : 1034,
"meta" : "some meta info …"
},
{
"ts" : 1458518979,
"value" : 518,
"meta" : "some meta info …"
}
],
"some-id-1337" : [
{
"ts" : 1458017854,
"value" : 361,
"meta" : "some meta info …"
},
{
"ts" : 1458050773,
"value" : 384,
"meta" : "some meta info …"
},
{
"ts" : 1458115173,
"value" : 383,
"meta" : "some meta info …"
},
{
"ts" : 1458143968,
"value" : 382,
"meta" : "some meta info …"
},
{
"ts" : 1458176011,
"value" : 381,
"meta" : "some meta info …"
},
{
"ts" : 1458212600,
"value" : 384,
"meta" : "some meta info …"
},
{
"ts" : 1458245285,
"value" : 383,
"meta" : "some meta info …"
},
{
"ts" : 1458277108,
"value" : 382,
"meta" : "some meta info …"
},
{
"ts" : 1458309875,
"value" : 379,
"meta" : "some meta info …"
},
{
"ts" : 1458338258,
"value" : 378,
"meta" : "some meta info …"
},
{
"ts" : 1458374471,
"value" : 374,
"meta" : "some meta info …"
},
{
"ts" : 1458405856,
"value" : 364,
"meta" : "some meta info …"
},
{
"ts" : 1458435330,
"value" : 363,
"meta" : "some meta info …"
},
{
"ts" : 1458471185,
"value" : 362,
"meta" : "some meta info …"
},
{
"ts" : 1458500103,
"value" : 361,
"meta" : "some meta info …"
},
{
"ts" : 1458535837,
"value" : 360,
"meta" : "some meta info …"
},
{
"ts" : 1458568805,
"value" : 364,
"meta" : "some meta info …"
},
{
"ts" : 1458633188,
"value" : 384,
"meta" : "some meta info …"
}
]
}
}

El problema con este approcach es el tráfico generado al cargar todo el documento, que es necesario para verificar cambios o brechas.

Si pudiera recuperar solo el valor más reciente (el último valor de la matriz), el tráfico se reduciría drásticamente.

{
"series" : {
"some-id-1" : [
{
"ts" : 1458606338,
"expired": true
}
],
"some-id-2" : [
{
"ts" : 1439802083,
"value" : 430,
"meta" : "some meta info …"
}
],
"some-id-42" : [
{
"ts" : 1458518979,
"value" : 518,
"meta" : "some meta info …"
}
],
"some-id-1337" : [
{
"ts" : 1458633188,
"value" : 384,
"meta" : "some meta info …"
}
]
}
}

Mientras conozco la identificación, puedo usar una proyección para recuperar la última entrada reciente.

db.Series.find(
{ "series.some-id-42" : { $exists: true } },
{ "series.some-id-42.$": -1}
)

Pero como un cambio puede contener espacios, no conozco todos los identificadores que se producen en el documento de la serie de destino.

¿Existe alguna posibilidad de archivar esto utilizando el marco de agregación o con alguna proyección inteligente?

Mi única idea es almacenar los valores recientes en una forma más compacta y solo para proyectos {last_recent: 1}:

{
"recent": {
"some-id-1" : 0,
"some-id-2" : 430,
"some-id-42" : 518,
"some-id-1337" : 384
}
"series" : { /* … */ }
}

Pero espero que haya una solución más elegante para este problema.

Respuestas

0 para la respuesta № 1

El problema principal es que estás almacenando datos en los nombres de los campos, que es el ID.

El esquema probablemente debería ser:

{
"series": [
{
"id": 1,
"content": [
{
"ts": 1458606338,
"expired": true
}
]
},
{
"id": 2,
"content": [
{
"ts": 1439802083,
"value": 430,
"meta": "some meta info …"
}
]
},
{
"id": 42,
"content": [
{
"ts": 1458518979,
"value": 518,
"meta": "some meta info …"
}
]
},
{
"id": 1337,
"content": [
{
"ts": 1458633188,
"value": 384,
"meta": "some meta info …"
}
]
}
]
}