MongoDB में, $substrCP
एग्रीगेशन पाइपलाइन ऑपरेटर निर्दिष्ट UTF-8 कोड पॉइंट इंडेक्स के आधार पर स्ट्रिंग का सबस्ट्रिंग लौटाता है।
सिंटैक्स
वाक्य रचना इस प्रकार है:
{ $substrCP: [ <string expression>, <code point index>, <code point count> ] }
कहां:
<string expression>
स्ट्रिंग है। यह तब तक कोई भी मान्य व्यंजक हो सकता है जब तक कि यह एक स्ट्रिंग में समाहित हो जाता है।-
<code point index>
वह जगह है जहां सबस्ट्रिंग शुरू करना है। यह तब तक कोई भी मान्य व्यंजक हो सकता है जब तक कि यह एक गैर-ऋणात्मक पूर्णांक में परिवर्तित हो जाता है। -
<code point count>
यह है कि सबस्ट्रिंग को कितने कोड बिंदुओं के लिए जारी रखना चाहिए। यह तब तक कोई भी मान्य व्यंजक हो सकता है जब तक यह एक गैर-ऋणात्मक पूर्णांक या संख्या का समाधान करता है जिसे पूर्णांक के रूप में दर्शाया जा सकता है।
उदाहरण
कल्पना कीजिए कि हमारे पास tests
. नामक संग्रह है निम्नलिखित दस्तावेज़ के साथ:
{ "_id" : 1, "data" : "Red Firetruck" }
हम $substrCP
. का उपयोग कर सकते हैं इस तरह:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 3 ] }
}
}
]
)
परिणाम:
{ "data" : "Red Firetruck", "result" : "Red" }
सूचकांक शून्य से शुरू होता है, और इसलिए हमारा सबस्ट्रिंग स्ट्रिंग की शुरुआत में शुरू हुआ, और तीन कोड बिंदुओं के लिए जारी रहा।
इस मामले में, हम अंग्रेजी वर्णों का उपयोग कर रहे हैं और प्रत्येक वर्ण का एक कोड बिंदु है। इससे हमारे लिए यह गिनना आसान हो जाता है कि कितने कोड बिंदुओं का उपयोग करना है।
आइए एक और उदाहरण चलाते हैं:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result_1: { $substrCP: [ "$data", 4, 4 ] },
result_2: { $substrCP: [ "$data", 8, 5 ] },
result_3: { $substrCP: [ "$data", 8, 20 ] }
}
}
]
).pretty()
परिणाम:
{ "data" : "Red Firetruck", "result_1" : "Fire", "result_2" : "truck", "result_3" : "truck" }
हमारे तीसरे परिणाम में ध्यान दें, हमने उपलब्ध की तुलना में अधिक कोड बिंदु निर्दिष्ट किए, लेकिन इसने सभी वर्णों को स्ट्रिंग के अंत में वापस कर दिया।
विशेषक चिह्न
कुछ वर्णों में एक विशेषक चिह्न जोड़ा गया है, जिसके परिणामस्वरूप अनेक कोड बिंदु प्राप्त होते हैं।
मान लीजिए हमारे पास thai
. नामक संग्रह है जिसमें निम्नलिखित दस्तावेज शामिल हैं:
{ "_id" : 1, "data" : "ไม้เมือง" } { "_id" : 2, "data" : "ไ" } { "_id" : 3, "data" : "ม้" } { "_id" : 4, "data" : "เ" } { "_id" : 5, "data" : "มื" } { "_id" : 6, "data" : "อ" } { "_id" : 7, "data" : "ง" }
इन दस्तावेज़ों में थाई वर्ण हैं। हम देख सकते हैं कि इनमें से दो वर्णों में एक विशेषक (प्रारंभिक ग्लिफ़ के ऊपर एक छोटा ग्लिफ़) शामिल है।
दस्तावेज़ 2 से 7 तक दस्तावेज़ 1 में मौजूद प्रत्येक वर्ण को सूचीबद्ध करें।
सबस्ट्रिंग लेने से पहले, आइए जानें कि इनमें से प्रत्येक वर्ण में कितने कोड बिंदु हैं $strLenCP
का उपयोग करके ऑपरेटर:
db.thai.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
परिणाम:
{ "data" : "ไม้เมือง", "result" : 8 } { "data" : "ไ", "result" : 1 } { "data" : "ม้", "result" : 2 } { "data" : "เ", "result" : 1 } { "data" : "มื", "result" : 2 } { "data" : "อ", "result" : 1 } { "data" : "ง", "result" : 1 }
हम देख सकते हैं कि विशेषक वाले दो वर्णों में दो कोड बिंदु होते हैं, और अन्य के पास एक कोड बिंदु होता है।
आइए लागू करें $substrCP
पहले दस्तावेज़ में:
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
परिणाम:
{ "data" : "ไม้เมือง", "result" : "ม้" }
हमारे 1
. के शुरुआती बिंदु के आधार पर और 2
. की हमारी कोड बिंदु गणना , हमें दूसरा वर्ण और उससे संबंधित विशेषक मिलता है।
ग्लिफ़ को अलग करें
पिछले उदाहरण में हमारा तीसरा तर्क 2 था ताकि यह चरित्र और विशेषक को एक साथ लौटा सके। यहां बताया गया है कि जब हम 1 का तीसरा तर्क देते हैं तो क्या होता है।
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 1 ] }
}
}
]
)
परिणाम:
{ "data" : "ไม้เมือง", "result" : "ม" }
पहला वर्ण विशेषक चिह्न के बिना लौटाया जाता है।
अन्य डेटा प्रकार
$substrCP
ऑपरेटर केवल स्ट्रिंग्स पर काम करता है। हालांकि, यदि आपके पास कोई अन्य डेटा प्रकार है, तो इसे तब तक काम करना चाहिए, जब तक कि यह एक स्ट्रिंग को हल कर सकता है।
मान लीजिए हमारे पास निम्नलिखित दस्तावेज़ हैं:
{ "_id" : 2, "data" : 123456 }
data
फ़ील्ड में एक संख्या होती है।
यहां बताया गया है कि जब हम $substrCP
लागू करते हैं तो क्या होता है उस क्षेत्र के लिए:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
परिणाम:
{ "data" : 123456, "result" : "23" }
यह काम ठीक से करने में कामयाब रहा (हालांकि ध्यान रखें कि परिणाम एक स्ट्रिंग है - संख्या नहीं)।
हमारे पास दिनांक वस्तु के साथ एक और दस्तावेज़ है:
{ "_id" : 3, "data" : ISODate("2021-01-03T23:30:15.100Z") }
अब $substrCP
apply लागू करते हैं उस दस्तावेज़ के लिए:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 4 ] }
}
}
]
)
परिणाम:
{ "data" : ISODate("2021-01-03T23:30:15.100Z"), "result" : "2021" }
तो इस परिदृश्य में भी इसने ठीक काम किया।
शून्य मान
अगर स्ट्रिंग null
है , परिणाम एक खाली स्ट्रिंग है।
मान लीजिए हमारे पास निम्नलिखित दस्तावेज़ हैं:
{ "_id" : 4, "data" : null }
यहां बताया गया है कि जब हम $substrCP
लागू करते हैं तो क्या होता है उस दस्तावेज़ के लिए:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
परिणाम:
{ "data" : null, "result" : "" }
अनुपलब्ध फ़ील्ड
उस फ़ील्ड से सबस्ट्रिंग प्राप्त करने का प्रयास जो मौजूद नहीं है, एक खाली स्ट्रिंग में परिणाम देता है।
मान लीजिए हमारे पास निम्नलिखित दस्तावेज़ हैं:
{ "_id" : 5 }
लागू करें $substrCP
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
परिणाम:
{ "result" : "" }