W zasadzie trudne pytanie, ale pozostanę przy uproszczonym przypadku, w którym przedstawiasz dwa dokumenty i na tym opieram rozwiązanie. Koncepcje powinny być abstrakcyjne, ale trudniejsze w przypadku rozszerzonych przypadków. Jest to możliwe dzięki struktury agregacji ogólnie:
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
]
}
}
}}
])
Prawdopodobnie przesadzone, nie jestem pewien intencji, ale wynik tego na podstawie próbki będzie następujący:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Który pasuje do obliczeń.
Możesz dostosować się do swojego przypadku, ale ogólna zasada jest taka, jak pokazano.
Ostatni etap „potoku” jest trochę „ekstremalny”, ponieważ wszystko, co się robi, to połączenie wyników w jeden dokument. W przeciwnym razie wyniki „X” i „Y” są już uzyskiwane w dwóch dokumenty w przygotowaniu. Głównie przez $group
operacja z $first
i $last
operacje, aby znaleźć odpowiednie elementy na granicy grupowania.
Kolejne operacje w $project
jako etap potoku wykonuje wymaganą matematykę w celu określenia odrębnych wyników. Zobacz operatory agregacji
aby uzyskać więcej informacji, w szczególności $divide
i $subtract
.
Cokolwiek robisz, podążasz tym kursem. Uzyskaj parę "start" i "end" na swoich dwóch klawiszach. Następnie wykonaj obliczenia.