Труден въпрос по принцип, но ще остана с опростения случай, който представяте от два документа, и ще базирам решение на това. Понятията трябва да са абстрактни, но са по-трудни за разширени случаи. Възможно с рамката за агрегиране като цяло:
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
]
}
}
}}
])
Вероятно преувеличено, не съм сигурен в намерението, но резултатът от това въз основа на извадката ще бъде:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Което отговаря на изчисленията.
Можете да се адаптирате към вашия случай, но общият принцип е както е показано.
Последният етап на "тръбопровод" там е малко "екстремен", тъй като всичко, което се прави, е комбинирането на резултатите в един документ. В противен случай резултатите "X" и "Y" вече са получени вдве документи в процес на подготовка. Предимно от $group
операция с $first
и $last
операции за намиране на съответните елементи на границата на групиране.
Последващите операции в $project
като етап на тръбопровод изпълнява необходимите математически изчисления, за да определи отделните резултати. Вижте операторите за агрегиране
за повече подробности, по-специално $divide
и $subtract
.
Каквото и да правите, следвате този курс. Вземете двойка "начало" и "край" на вашите два ключа. След това извършете изчисленията.