V zásadě těžká otázka, ale zůstanu u zjednodušeného případu dvou dokumentů, který předkládáte, a založím na tom řešení. Pojmy by měly být abstraktní, ale pro rozšířené případy jsou obtížnější. Možné s rámcem agregace obecně:
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
]
}
}
}}
])
Možná přehnané, nejsem si jistý záměrem, ale výsledek na základě vzorku by byl:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Což odpovídá výpočtům.
Můžete se přizpůsobit vašemu případu, ale obecný princip je takový, jak je uvedeno.
Poslední „potrubní“ fáze je trochu „extrémní“, protože vše, co se dělá, je spojit výsledky do jednoho dokumentu. Jinak jsou výsledky „X“ a „Y“ již získány ve dvou dokumenty v procesu. Většinou od $group
operace s $first
a $last
operace k nalezení příslušných prvků na hranici seskupení.
Následné operace v $project
jako fáze potrubí provádí požadovanou matematiku k určení odlišných výsledků. Viz operátory agregace
další podrobnosti, zejména $divide
a $subtract
.
Ať děláte cokoli, dodržujte tento kurz. Získejte „start“ a „end“ pár na svých dvou klíčích. Poté proveďte výpočty.