Critérios / agregação: procure todos os documentos completos cujo campo array tenha elemento com o último status fornecido
Eu tenho uma estrutura de documentos como esta -
{
"_id" : "11223344",
"orderId" : "00001041",
"key" : "56h68ab4c876dbe1cd0b1ee"
"status" : [
{
"updatedTimeStamp" : ISODate("2017-06-01T16:05:42.737Z"),
"orderStatus" : "INITIATED"
},
{
"updatedTimeStamp" : ISODate("2017-06-01T16:05:42.737Z"),
"orderStatus" : "CONFIRM_PAYMENT"
},
{
"updatedTimeStamp" : ISODate("2017-06-01T16:07:36.797Z"),
"orderStatus" : "RESTAURENT_CONFIRMATION_PENDING"
},
{
"updatedTimeStamp" : ISODate("2017-06-01T16:20:36.798Z"),
"orderStatus" : "ORDER_CONFIRMED"
},
{
"updatedTimeStamp" : ISODate("2017-06-01T16:51:27.562Z"),
"orderStatus" : "PREPARED"
},
{
"updatedTimeStamp" : ISODate("2017-06-01T17:31:27.562Z"),
"orderStatus" : "DISPATCHED"
}
],
"customerDetails" : {
"firstName" : "XXXX",
"lastName" : "XXXXX",
"emailId" : "[email protected]",
"phoneNumber" : "XXXXXXXXX"
},
"amountPaid" : "250.0",
"orderDetails" : {blah... blah... blah...}
}
Nesta coleção de pedidos, desejo procurar todos os documentos com o status x determinado (por exemplo, CONFIRM_PAYMENT). Portanto, é encontrado pelo valor máximo de "updatedTimeStamp" na matriz de documentos "status" e se esse documento incorporado da matriz máxima for igual ao status "CONFIRM_PAYMENT", o documento inteiro deverá ser incluído no resultado final.
Podemos resolvê-lo com a API de critérios?
Há um tipo semelhante de pergunta -Localização do MongoDB por valor máximo na matriz de documentos . Mas eu quero fazer isso com critérios de primavera ou API agregada. Abaixo está a consulta que fiz com a ajuda da pergunta acima mencionada. Esta consulta está fornecendo todos os IDs de documentos que eu quero. Estou interessado em documentos completos.
db.order.aggregate([
{$match: {key:"56h68ab4c876dbe1cd0b1ee"}},
{$unwind: "$status"},
{$project:{Id:"$_id",status:"$status.orderStatus", updatedTimeStamp:"$status.updatedTimeStamp"} },
{$sort:{updatedTimeStamp:1} },
{$group: {_id: "$Id", LatestStatus:{$last: "$status"}, updatedTimeStamp:{$last: "$updatedTimeStamp"} } },
{$match:{"LatestStatus":"CONFIRM_PAYMENT"}},
{$project:{Id:"$Id"}}
])
Alguém pode ajudar a resolver isso com critérios ou API agregada? * Há outro filtro nesta consulta que é "chave".