Svår fråga i princip, men jag stannar vid det förenklade fallet du presenterar av två dokument och baserar en lösning kring det. Begreppen ska abstrakta, men är svårare för utökade fall. Möjligt med aggregationsramverket i allmänhet:
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
]
}
}
}}
])
Möjligen överdrivet, inte säker på avsikten, men resultatet av detta baserat på provet skulle vara:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Vilket stämmer med beräkningarna.
Du kan anpassa dig efter ditt fall, men den allmänna principen är som visas.
Det sista "pipeline"-steget där är lite "extremt" eftersom allt som görs är att kombinera resultaten till ett enda dokument. Annars erhålls "X"- och "Y"-resultaten redan i två dokument i pipelinen. Mestadels av $group
operation med $first
och $last
operationer för att hitta respektive element på grupperingsgränsen.
De efterföljande operationerna i $project
som ett pipelinesteg utför den nödvändiga matematiken för att bestämma de distinkta resultaten. Se aggregationsoperatorerna
för mer information, särskilt $divide
och $subtract
.
Vad du än gör följer du denna kurs. Få ett "start" och "slut" par på dina två nycklar. Utför sedan beräkningarna.