Svært spørgsmål i princippet, men jeg vil blive ved den forenklede sag, du fremlægger af to dokumenter, og basere en løsning på det. Begreberne burde abstrahere, men er sværere for udvidede tilfælde. Muligt med aggregeringsramme generelt:
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
]
}
}
}}
])
Muligvis overdrevet, ikke sikker på hensigten, men outputtet af dette baseret på prøven ville være:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Hvilket stemmer overens med beregningerne.
Du kan tilpasse dig din sag, men det generelle princip er som vist.
Det sidste "pipeline"-stadium der er lidt "ekstremt", da det eneste, der gøres, er at kombinere resultaterne til et enkelt dokument. Ellers er "X"- og "Y"-resultaterne allerede opnået i to dokumenter i pipelinen. Mest af $group
operation med $first
og $last
operationer for at finde de respektive elementer på grupperingsgrænsen.
De efterfølgende operationer i $project
som en pipeline fase udfører den nødvendige matematik for at bestemme de forskellige resultater. Se aggregationsoperatørerne
for flere detaljer, især $divide
og $subtract
.
Uanset hvad du gør, følger du dette kursus. Få et "start" og "slut" par på dine to nøgler. Udfør derefter beregningerne.