Domanda difficile in linea di principio, ma rimarrò con il caso semplificato che presenti di due documenti e baserò una soluzione su questo. I concetti dovrebbero essere astratti, ma sono più difficili per i casi estesi. Possibile con il framework di aggregazione in generale:
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
]
}
}
}}
])
Forse esagerato, non sono sicuro dell'intento, ma l'output di questo basato sul campione sarebbe:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Che corrisponde ai calcoli.
Puoi adattarti al tuo caso, ma il principio generale è quello mostrato.
L'ultima fase della "conduttura" è un po' "estrema" poiché tutto ciò che viene fatto è combinare i risultati in un unico documento. In caso contrario, i risultati "X" e "Y" sono già ottenuti in due documenti in cantiere. Principalmente dal $group
operazione con $first
e $last
operazioni per trovare i rispettivi elementi sul confine di raggruppamento.
Le successive operazioni in $project
come una fase della pipeline esegue la matematica richiesta per determinare i risultati distinti. Consulta gli operatori di aggregazione
per maggiori dettagli, in particolare $divide
e $subtract
.
Qualunque cosa tu faccia, segui questo corso. Ottieni una coppia "inizio" e "fine" sulle tue due chiavi. Quindi esegui i calcoli.