Tengo una colección con documentos como los siguientes:
{ _id : 1, code: 1, state: "FINISHED", history: //Object { 'CREATED': { date: xxx , anotherParam: xxx }, 'FINISHED': { date: xxx , anotherParam: xxx } } }, { _id : 2, code: 1, state: "CREATED", history: //Object { 'CREATED': { date: xxx , anotherParam: xxx } }, { _id : 3, code: 2, state: "FINISHED", history: //Object { 'CREATED': { date: xxx , anotherParam: xxx }, 'FINISHED': { date: xxx , anotherParam: xxx } } }Lo que quiero hacer es una consulta de búsqueda en la que ordeno los documentos por la fecha anidada en el historial cuya clave es el valor del estado de cada documento.
En el ejemplo anterior, ordenaría por el valor actual del estado (dentro de la clave de historial correspondiente => "history.VALUE_OF_STATE.date" .
El desafío es poder TERMINAR dentro de ese camino según el valor del estado.
EG: Consultar todos los documentos donde el código == 1 y ordenar por historial.VALOR_DE_CADA_DOCUMENTO_ESTADO.fecha
Esto debería devolver doc _id 1 y doc _id 2, ordenados por fecha, considerando la fecha del documento 1 como history.FINISHED.date, y la fecha del documento 2 history.CREATED.date
Con un poco de codificación, ya que solo tiene 4 estados posibles:
db.states.aggregate([ { $match: { code: 1 } }, { $project: { _id: 1, code: 1, state: 1, history: 1, sortingField: { $switch: { branches: [ { case: { $eq: ["$state", "CREATED"] }, then: "$history.CREATED.date", }, { case: { $eq: ["$state", "FINISHED"] }, then: "$history.FINISHED.date", }, ], }, }, }, }, { $sort: { sortingField: 1 }, }, ]);