MongoDB में, $stdDevSamp
एकत्रीकरण पाइपलाइन ऑपरेटर इनपुट मानों के नमूना मानक विचलन की गणना करता है।
इनपुट मान दस्तावेज़ों के समूह (अर्थात एक ही कुंजी द्वारा समूहीकृत किए गए दस्तावेज़) से हो सकते हैं, या वे एक दस्तावेज़ के भीतर कई फ़ील्ड हो सकते हैं।
$stdDevSamp
$stdDevPop
. के समान है . अंतर यह है कि $stdDevSamp
नमूना . की गणना करता है मानक विचलन, जबकि $stdDevPop
जनसंख्या की गणना करता है मानक विचलन।
इसलिए, $stdDevSamp
. का उपयोग करें यदि आपके मूल्यों में डेटा की आबादी का एक नमूना शामिल है जिससे जनसंख्या के बारे में सामान्यीकरण किया जा सके। यदि मान डेटा की संपूर्ण जनसंख्या का प्रतिनिधित्व करते हैं या आप एक बड़ी जनसंख्या के बारे में सामान्यीकरण नहीं करना चाहते हैं, तो $stdDevPop
का उपयोग करें इसके बजाय।
सिंटैक्स
$stdDevSamp
ऑपरेटर दो सिंटैक्स का समर्थन करता है।
सिंटैक्स 1:
{ $stdDevSamp: <expression> }
सिंटैक्स 2:
{ $stdDevSamp: [ <expression1>, <expression2> ... ] }
पहला सिंटैक्स एक तर्क को स्वीकार करता है और दूसरा सिंटैक्स कई तर्कों को स्वीकार करता है।
जब $group
. में उपयोग किया जाता है चरण, आप केवल पहले सिंटैक्स का उपयोग कर सकते हैं। इस मामले में, $stdDevSamp
कुंजी द्वारा समान समूह को साझा करने वाले दस्तावेज़ों के समूह के लिए निर्दिष्ट अभिव्यक्ति का नमूना मानक विचलन लौटाता है।
सिंटैक्स 1 के उदाहरण (एकल तर्क)
यहां कुछ उदाहरण दिए गए हैं जो सिंटैक्स 1 का उपयोग करते हैं।
समूहीकृत दस्तावेज़
यह उदाहरण $stdDevSamp
. का उपयोग करता है $group
. के संयोजन के साथ कुंजी द्वारा समूहीकृत दस्तावेज़ों के समूह में नमूना मानक विचलन वापस करने के लिए।
मान लीजिए हमारे पास stonks
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "ticker" : "gme", "price" : 10 } { "_id" : 2, "ticker" : "gme", "price" : 40 } { "_id" : 3, "ticker" : "gme", "price" : 90 } { "_id" : 4, "ticker" : "gme", "price" : 180 } { "_id" : 5, "ticker" : "gme", "price" : 290 } { "_id" : 6, "ticker" : "gme", "price" : 390 } { "_id" : 7, "ticker" : "gme", "price" : 190 } { "_id" : 8, "ticker" : "gme", "price" : 90 } { "_id" : 9, "ticker" : "gme", "price" : 10 } { "_id" : 10, "ticker" : "jnj", "price" : 131 } { "_id" : 11, "ticker" : "jnj", "price" : 133 } { "_id" : 12, "ticker" : "jnj", "price" : 138 } { "_id" : 13, "ticker" : "jnj", "price" : 141 } { "_id" : 14, "ticker" : "jnj", "price" : 145 } { "_id" : 15, "ticker" : "jnj", "price" : 150 } { "_id" : 16, "ticker" : "jnj", "price" : 154 } { "_id" : 17, "ticker" : "jnj", "price" : 156 } { "_id" : 18, "ticker" : "jnj", "price" : 160 }
हम इन दस्तावेज़ों को उनके ticker
. द्वारा समूहित कर सकते हैं फ़ील्ड, और फिर $stdDevSamp
. का उपयोग करें price
. का नमूना मानक विचलन लौटाने के लिए प्रत्येक समूह के लिए फ़ील्ड:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
result: { $stdDevSamp: "$price" }
}
}
]
)
परिणाम:
{ "_id" : "gme", "result" : 131.24404748406687 } { "_id" : "jnj", "result" : 10.344080432788612 }
हम देख सकते हैं कि gme
jnj
. की तुलना में बहुत अधिक नमूना मानक विचलन है ।
सरणी
यह उदाहरण $stdDevSamp
. पर लागू होता है एक एकल दस्तावेज़ के लिए जिसमें मानों की एक सरणी वाला फ़ील्ड होता है।
यह विकल्प केवल एकल तर्क सिंटैक्स का उपयोग करते समय उपलब्ध होता है। बहु-तर्क सिंटैक्स का उपयोग करते समय सरणियों को अनदेखा कर दिया जाता है (इस पर और अधिक नीचे)।
मान लीजिए हमारे पास players
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 7, 2, 3, 8, 7, 1 ] } { "_id" : 2, "player" : "Marge", "scores" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8, 0, 1, 3 ] } { "_id" : 4, "player" : "Brian", "scores" : [ 7 ] } { "_id" : 5, "player" : "Farnsworth", "scores" : [ ] } { "_id" : 6, "player" : "Meg", "scores" : null }
हम $stdDevSamp
. लागू कर सकते हैं scores
. तक प्रत्येक दस्तावेज़ में फ़ील्ड:
db.players.aggregate(
[
{
$project:
{
result: { $stdDevSamp: "$scores" }
}
}
]
)
परिणाम:
{ "_id" : 1, "result" : 3.0783421635988546 } { "_id" : 2, "result" : 7.633260552782583 } { "_id" : 3, "result" : 5.988878581726855 } { "_id" : 4, "result" : null } { "_id" : 5, "result" : null } { "_id" : 6, "result" : null }
इस मामले में, पहले तीन दस्तावेज़ों ने विभिन्न संख्याओं के लिए नमूना मानक विचलन लौटाया जो उनके संबंधित सरणियों में थे।
दस्तावेज़ 4 के परिणामस्वरूप null
. का मानक विचलन हुआ . ऐसा इसलिए है क्योंकि हमने सरणी में केवल एक संख्या प्रदान की है। अगर हम $stdDevPop
. का इस्तेमाल करते , यह वापस आ जाता 0
।
दस्तावेज़ 5 लौटा null
क्योंकि हमने एक खाली सरणी प्रदान की है।
दस्तावेज़ 6 लौटा null
क्योंकि हमने null
प्रदान किया है तर्क के रूप में।
सिंटैक्स 2 का उदाहरण (एकाधिक तर्क)
दूसरे सिंटैक्स में $stdDevSamp
. प्रदान करना शामिल है एक से अधिक तर्क के साथ। $stdDevSamp
फिर सभी दिए गए तर्कों के आधार पर मानक विचलन की गणना करता है।
मान लीजिए हमारे पास data
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "a" : 1, "b" : 2, "c" : 3, "d" : 4 } { "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 4 ] } { "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "Hey" }
हम $stdDevSamp
. का उपयोग कर सकते हैं a
. का नमूना मानक विचलन लौटाने के लिए , b
, c
, और d
प्रत्येक दस्तावेज़ के क्षेत्र:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
परिणाम:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
पहले दस्तावेज़ का परिणाम 1
. के इनपुट मानों पर आधारित होता है , 2
, 3
, और 4
।
हालांकि, पिछले दो दस्तावेज़ों का परिणाम केवल 1
था , 2
, और 3
मूल्यांकन किया जा रहा है। $stdDevSamp
ऑपरेटर ने उनके d
. पर ध्यान नहीं दिया खेत।
$stdDevSamp
गैर-संख्यात्मक मानों की उपेक्षा करता है। तो इस मामले में यह नजरअंदाज कर दिया "Hey"
दस्तावेज़ 3 में और शेष (संख्यात्मक) फ़ील्ड से नमूना मानक विचलन की गणना की।
दस्तावेज़ 2 के लिए, इसका d
फ़ील्ड में एक सरणी है। जैसा कि बताया गया है, $stdDevSamp
बहु-तर्क सिंटैक्स का उपयोग करते समय ऑपरेटर सरणियों को अनदेखा करता है। अधिक सटीक रूप से, यह इस संदर्भ में उपयोग किए जाने पर सरणियों को गैर-संख्यात्मक मानों के रूप में मानता है। और जैसा कि बताया गया है, $stdDevSamp
गैर-संख्यात्मक मानों की उपेक्षा करता है।
यदि सभी मान गैर-संख्यात्मक हैं, तो $stdDevSamp
रिटर्न null
।
अनुपलब्ध फ़ील्ड
बहु-तर्क सिंटैक्स का उपयोग करते समय, $stdDevSamp
किसी भी लापता फ़ील्ड को अनदेखा करता है। यही है, यदि आप किसी ऐसे क्षेत्र की आपूर्ति करते हैं जो मौजूद नहीं है, तो वह इसे अनदेखा कर देता है। यदि कोई भी फ़ील्ड मौजूद नहीं है, तो यह null
लौटाता है ।
उदाहरण:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
परिणाम:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
इस मामले में मैंने एक अतिरिक्त क्षेत्र प्रदान किया ($e
) जो दस्तावेज़ में मौजूद नहीं है। $stdDevSamp
शेष फ़ील्ड के आधार पर नमूना मानक विचलन की गणना की जो करते हैं मौजूद है।
हालांकि, यहां क्या होता है जब कोई नहीं फ़ील्ड मौजूद हैं:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$x", "$y", "$z" ] }
}
}
]
)
परिणाम:
{ "_id" : 1, "result" : null } { "_id" : 2, "result" : null } { "_id" : 3, "result" : null }
परिणाम null
है सभी दस्तावेज़ों के लिए।
एकल-तर्क सिंटैक्स का उपयोग करते समय, अनुपलब्ध फ़ील्ड का परिणाम null
होता है ।
उदाहरण:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
result: { $stdDevSamp: "$oops!" }
}
}
]
)
परिणाम:
{ "_id" : "gme", "result" : null } { "_id" : "jnj", "result" : null }
उपलब्ध चरण
$stdDevSamp
निम्नलिखित चरणों में उपलब्ध है:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
चरण जिसमें एक$expr
. शामिल है अभिव्यक्ति