Pergunta difícil em princípio, mas vou ficar com o caso simplificado que você apresenta de dois documentos e basear uma solução em torno disso. Os conceitos devem ser abstratos, mas são mais difíceis para casos expandidos. Possível com a estrutura de agregação no geral:
db.collection.aggregate([
// Match the documents in a pair
{ "$match": {
"timeMilliSec": { "$in": [ 1414590255, 1414590245 ] }
}}
// Trivial, just keeping an order
{ "$sort": { "timeMilliSec": -1 } },
// Unwind the arrays
{ "$unwind": "$data" },
// Group first and last
{ "$group": {
"_id": "$data.name",
"firstX": { "$first": "$data.x" },
"lastX": { "$last": "$data.x" },
"firstY": { "$first": "$data.y" },
"lastY": { "$last": "$data.y" }
}},
// Difference on the keys
{ "$project": {
"diff": {
"$divide": [
{ "$subtract": [ "$firstX", "$lastX" ] },
{ "$subtract": [ "$firstY", "$lastY" ] }
]
}
}},
// Not sure you want to take it this far
{ "$group": {
"_id": null,
"diffX": {
"$min": {
"$cond": [
{ "$eq": [ "$_id", "X" ] },
"$diff",
false
]
}
},
"diffY": {
"$min": {
"$cond": [
{ "$eq": [ "$_id", "Y" ] },
"$diff",
false
]
}
}
}}
])
Possivelmente exagerado, não tenho certeza da intenção, mas a saída disso com base na amostra seria:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
O que corresponde aos cálculos.
Você pode adaptar ao seu caso, mas o princípio geral é o mostrado.
A última etapa do "pipeline" é um pouco "extrema", pois tudo o que é feito é combinar os resultados em um único documento. Caso contrário, os resultados "X" e "Y" já são obtidos em dois documentos em tramitação. Principalmente pelo
$group
operação com $first
e $last
operações para encontrar os respectivos elementos no limite de agrupamento. As operações subsequentes em
$project
como um estágio de pipeline executa a matemática necessária para determinar os resultados distintos. Consulte os operadores de agregação
para obter mais detalhes, especialmente $divide
e $subtract
. Faça o que fizer, você segue este curso. Obtenha um par de "início" e "fim" em suas duas chaves. Em seguida, faça os cálculos.