MongoDB में, $substrBytes
एग्रीगेशन पाइपलाइन ऑपरेटर निर्दिष्ट UTF-8 एन्कोडेड बाइट इंडेक्स के आधार पर स्ट्रिंग का सबस्ट्रिंग लौटाता है।
सिंटैक्स
वाक्य रचना इस प्रकार है:
{ $substrBytes: [ <string expression>, <byte index>, <byte count> ] }
कहां:
<string expression>
स्ट्रिंग है। यह तब तक कोई भी मान्य व्यंजक हो सकता है जब तक कि यह एक स्ट्रिंग में समाहित हो जाता है।-
<byte index>
वह जगह है जहां सबस्ट्रिंग शुरू करना है। यह तब तक कोई भी मान्य व्यंजक हो सकता है जब तक यह एक गैर-ऋणात्मक पूर्णांक या संख्या का समाधान करता है जिसे पूर्णांक के रूप में दर्शाया जा सकता है। <byte count>
यह है कि सबस्ट्रिंग कितने बाइट्स के लिए जारी रहनी चाहिए। यह तब तक कोई भी मान्य व्यंजक हो सकता है जब तक यह एक गैर-ऋणात्मक पूर्णांक या संख्या का समाधान करता है जिसे पूर्णांक के रूप में दर्शाया जा सकता है।
उदाहरण
कल्पना कीजिए कि हमारे पास tests
. नामक संग्रह है निम्नलिखित दस्तावेज़ के साथ:
{ "_id" : 1, "data" : "Red Firetruck" }
हम $substrBytes
. का उपयोग कर सकते हैं इस तरह:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrBytes: [ "$data", 0, 3 ] }
}
}
]
)
परिणाम:
{ "data" : "Red Firetruck", "result" : "Red" }
इंडेक्स शून्य से शुरू होता है, और इसलिए हमारा सबस्ट्रिंग स्ट्रिंग की शुरुआत में शुरू होता है, और तीन बाइट्स के लिए जारी रहता है।
इस मामले में, हम अंग्रेजी वर्णों का उपयोग कर रहे हैं और प्रत्येक वर्ण एक बाइट है। इससे हमारे लिए यह गिनना आसान हो जाता है कि कितने बाइट्स का उपयोग करना है।
आइए एक और उदाहरण चलाते हैं:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result_1: { $substrBytes: [ "$data", 4, 4 ] },
result_2: { $substrBytes: [ "$data", 8, 5 ] },
result_3: { $substrBytes: [ "$data", 8, 20 ] }
}
}
]
).pretty()
परिणाम:
{ "data" : "Red Firetruck", "result_1" : "Fire", "result_2" : "truck", "result_3" : "truck" }
हमारे तीसरे परिणाम में ध्यान दें, हमने उपलब्ध बाइट्स की तुलना में अधिक बाइट्स निर्दिष्ट किए, लेकिन इसने सभी वर्णों को स्ट्रिंग के अंत में वापस कर दिया।
मल्टी-बाइट वर्ण
कुछ वर्ण एक से अधिक बाइट का उपयोग करते हैं। कुछ लोग दो का उपयोग करते हैं, कुछ तीन का उपयोग करते हैं, और कुछ चार का भी उपयोग करते हैं।
यहां एक दस्तावेज़ का उदाहरण दिया गया है जिसमें प्रतीकों का एक समूह है:
{ "_id" : 2, "data" : "©♡★✪☆" }
इनमें से प्रत्येक वर्ण एक से अधिक बाइट का उपयोग करता है। इसका मतलब है कि हमें सबस्ट्रिंग निकालते समय सावधान रहने की जरूरत है। हमें यह सुनिश्चित करने की आवश्यकता है कि हमारा प्रारंभिक बिंदु एक चरित्र के आधे रास्ते से शुरू नहीं होता है। यदि ऐसा होता है, तो एक त्रुटि होगी। इसी तरह, हमें यह सुनिश्चित करने की आवश्यकता है कि हमारा अंतिम बिंदु एक चरित्र के माध्यम से आधे रास्ते पर समाप्त नहीं होता है।
अभी के लिए, $substrBytes
. लागू करें बिना किसी त्रुटि के:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
bytes: { $strLenBytes: [ "$data" ] },
result: { $substrBytes: [ "$data", 0, 5 ] }
}
}
]
)
परिणाम:
{ "data" : "©♡★✪☆", "bytes" : 14, "result" : "©♡" }
हमारे 0
. के शुरुआती बिंदु के आधार पर और हमारी बाइट लंबाई 5
, हमें अपने परिणाम सेट में दो अक्षर मिलते हैं। इसलिए हम देख सकते हैं कि पहले दो अक्षर 5 बाइट्स का उपयोग करते हैं।
इस उदाहरण में मैंने $strLenBytes
. का भी उपयोग किया है स्ट्रिंग में बाइट्स की कुल संख्या वापस करने के लिए। मैंने यह मुख्य रूप से यह दिखाने के लिए किया था कि पांच वर्ण 14 बाइट्स (प्रति वर्ण एकाधिक बाइट्स) का उपयोग करते हैं।
यहां थोड़ा संशोधित उदाहरण दिया गया है जो लौटाए गए दो वर्णों में से प्रत्येक को लौटाता है:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
r1: { $substrBytes: [ "$data", 0, 2 ] },
r2: { $substrBytes: [ "$data", 2, 3 ] }
}
}
]
)
परिणाम:
{ "data" : "©♡★✪☆", "r1" : "©", "r2" : "♡" }
हम देख सकते हैं कि पहला वर्ण दो बाइट्स का उपयोग करता है और दूसरा वर्ण तीन का उपयोग करता है।
गलत शुरुआती बिंदु
यदि आपका प्रारंभिक बिंदु किसी वर्ण से आधा है, तो एक त्रुटि होती है।
उदाहरण:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrBytes: [ "$data", 1, 2 ] }
}
}
]
)
परिणाम:
Error: command failed: { "ok" : 0, "errmsg" : "$substrBytes: Invalid range, starting index is a UTF-8 continuation byte.", "code" : 28656, "codeName" : "Location28656" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
यह त्रुटि हमें बताती है कि starting index is a UTF-8 continuation byte
. दूसरे शब्दों में, हमने एक चरित्र के माध्यम से आधा शुरू करने की कोशिश की।
गलत अंत बिंदु
अंत बिंदु के साथ भी ऐसा ही है। यदि आपका अंतिम बिंदु किसी वर्ण से आधा है, तो एक त्रुटि होती है।
उदाहरण:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrBytes: [ "$data", 0, 1 ] }
}
}
]
)
परिणाम:
Error: command failed: { "ok" : 0, "errmsg" : "$substrBytes: Invalid range, ending index is in the middle of a UTF-8 character.", "code" : 28657, "codeName" : "Location28657" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
इस बार यह हमें बताता है कि ending index is in the middle of a UTF-8 character
।