In principe lastige vraag, maar ik blijf bij de vereenvoudigde casus die je presenteert van twee documenten en baseer daar een oplossing op. De concepten moeten abstract zijn, maar zijn moeilijker voor uitgebreide gevallen. Mogelijk met het aggregatieraamwerk algemeen:
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
]
}
}
}}
])
Mogelijk overdreven, niet zeker van de bedoeling, maar de output hiervan op basis van de steekproef zou zijn:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Wat overeenkomt met de berekeningen.
U kunt zich aanpassen aan uw geval, maar het algemene principe is zoals weergegeven.
De laatste "pijplijn"-fase is een beetje "extreem", omdat het enige dat wordt gedaan de resultaten in één document combineert. Anders worden de resultaten "X" en "Y" al verkregen in twee documenten in de pijplijn. Meestal door de $group
bewerking met $first
en $last
bewerkingen om de respectieve elementen op de groeperingsgrens te vinden.
De daaropvolgende bewerkingen in $project
als een pijplijnfase de vereiste wiskunde uitvoert om de verschillende resultaten te bepalen. Zie de aggregatie-operators
voor meer details, in het bijzonder $divide
en $subtract
.
Wat je ook doet, je volgt deze cursus. Krijg een "begin" en "eind" paar op uw twee sleutels. Voer vervolgens de berekeningen uit.