सिद्धांत रूप में कठिन प्रश्न, लेकिन मैं आपके द्वारा प्रस्तुत दो दस्तावेजों के सरलीकृत मामले के साथ रहने जा रहा हूं और उसके आसपास एक समाधान का आधार बनाऊंगा। अवधारणाएं सारगर्भित होनी चाहिए, लेकिन विस्तारित मामलों के लिए अधिक कठिन हैं। एकत्रीकरण ढांचे के साथ संभव सामान्य तौर पर:
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
]
}
}
}}
])
संभावित रूप से अतिरंजित, इरादे के बारे में निश्चित नहीं है, लेकिन नमूने के आधार पर इसका आउटपुट होगा:
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
जो गणनाओं से मेल खाता है।
आप अपने मामले के अनुकूल हो सकते हैं, लेकिन सामान्य सिद्धांत जैसा दिखाया गया है।
अंतिम "पाइपलाइन" चरण थोड़ा "चरम" है क्योंकि जो कुछ किया जाता है वह परिणामों को एक दस्तावेज़ में जोड़ता है। अन्यथा, "X" और "Y" परिणाम दो . में पहले ही प्राप्त हो चुके हैं पाइपलाइन में दस्तावेज। अधिकतर $group
द्वारा
$first
के साथ संचालन
और $last
समूह सीमा पर संबंधित तत्वों को खोजने के लिए संचालन।
$project
में परवर्ती संचालन
एक पाइपलाइन चरण के रूप में विशिष्ट परिणामों को निर्धारित करने के लिए आवश्यक गणित करता है। देखें एकत्रीकरण ऑपरेटर
अधिक विवरण के लिए, विशेष रूप से $divide
और $subtract
।
आप जो कुछ भी करते हैं आप इस कोर्स का पालन करते हैं। अपनी दो चाबियों पर "प्रारंभ" और "अंत" जोड़ी प्राप्त करें। फिर गणना करें।