Pertanyaan yang sulit pada prinsipnya, tetapi saya akan tetap dengan kasus sederhana yang Anda sajikan dari dua dokumen dan mendasarkan solusi di sekitar itu. Konsep harus abstrak, tetapi lebih sulit untuk kasus yang diperluas. Mungkin dengan kerangka kerja agregasi secara umum:
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
]
}
}
}}
])
Mungkin berlebihan, tidak yakin dengan maksudnya, tetapi output dari ini berdasarkan sampel adalah:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Yang cocok dengan perhitungan.
Anda dapat beradaptasi dengan kasus Anda, tetapi prinsip umumnya seperti yang ditunjukkan.
Tahap “pipeline” terakhir ada yang sedikit “ekstrim” karena yang dilakukan hanyalah menggabungkan hasil menjadi satu dokumen. Jika tidak, hasil "X" dan "Y" sudah diperoleh dalam dua dokumen dalam pipa. Sebagian besar oleh $group
operasi dengan $first
dan $last
operasi untuk menemukan masing-masing elemen pada batas pengelompokan.
Operasi selanjutnya di $project
sebagai tahap pipa melakukan matematika yang diperlukan untuk menentukan hasil yang berbeda. Lihat operator agregasi
untuk detail lebih lanjut, khususnya $divide
dan $subtract
.
Apa pun yang Anda lakukan, Anda mengikuti kursus ini. Dapatkan pasangan "mulai" dan "akhiri" pada dua kunci Anda. Kemudian lakukan perhitungan.