Câu hỏi khó về nguyên tắc, nhưng tôi sẽ ở lại với trường hợp đơn giản mà bạn trình bày về hai tài liệu và đưa ra giải pháp cho vấn đề đó. Các khái niệm nên trừu tượng, nhưng khó hơn đối với các trường hợp mở rộng. Có thể có với khung tổng hợp nói chung:
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
]
}
}
}}
])
Có thể bị thổi phồng quá mức, không chắc chắn về mục đích, nhưng kết quả của điều này dựa trên mẫu sẽ là:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
Phù hợp với các tính toán.
Bạn có thể điều chỉnh cho phù hợp với trường hợp của mình, nhưng nguyên tắc chung là như được minh họa.
Giai đoạn "đường ống" cuối cùng có một chút "cực đoan" vì tất cả những gì được thực hiện là kết hợp các kết quả vào một tài liệu duy nhất. Nếu không, kết quả "X" và "Y" đã nhận được trong hai tài liệu trong đường ống. Chủ yếu là của $group
hoạt động với $first
và $last
hoạt động để tìm các phần tử tương ứng trên ranh giới nhóm.
Các hoạt động tiếp theo trong $project
như một giai đoạn đường ống thực hiện phép toán cần thiết để xác định các kết quả khác biệt. Xem toán tử tổng hợp
để biết thêm chi tiết, đặc biệt là $divide
và $subtract
.
Dù bạn làm gì bạn cũng theo khóa học này. Nhận một cặp "bắt đầu" và "kết thúc" trên hai phím của bạn. Sau đó, thực hiện các phép tính.