MongoDB, $strLenBytes
aggregeringspipeline-operatören returnerar antalet UTF-8-kodade byte i den angivna strängen.
Varje tecken i en sträng kan innehålla olika antal byte, beroende på vilket tecken som används. $strLenBytes
operatorn kan räkna ut hur många byte varje tecken innehåller och returnera det korrekta resultatet för hela strängen.
Exempel
Anta att vi har en samling som heter english
med följande dokument:
{ "_id" :1, "data" :"Maimuang" }{ "_id" :2, "data" :"M" }{ "_id" :3, "data" :"a" }{ " _id" :4, "data" :"i" }{ "_id" :5, "data" :"m" }{ "_id" :6, "data" :"u" }{ "_id" :7, "data" :"a" }{ "_id" :8, "data" :"n" }{ "_id" :9, "data" :"g" }
Vi kan använda $strLenBytes
till datafältet i dessa dokument:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultat:
{ "data" :"Maimuang", "result" :8 }{ "data" :"M", "result" :1 }{ "data" :"a", "result" :1 }{ " data" :"i", "result" :1 }{ "data" :"m", "result" :1 }{ "data" :"u", "result" :1 }{ "data" :"a ", "result" :1 }{ "data" :"n", "result" :1 }{ "data" :"g", "result" :1 }
Vi kan se att hela ordet är 8 byte och varje tecken är 1 byte vardera.
Thailändska tecken
Här är ett exempel som använder thailändska tecken, som är 3 byte vardera.
Vi har en samling som heter thai
med följande dokument:
{ "_id" :1, "data" :"ไม้เมือง" }{ "_id" :2, "data" :"ไ" }{ "_id" :3, "data" :"ม้" }{ "_id" :4, "data" :"เ" }{ "_id" :5, "data" :"มื" }{ "_id" :6, "data" :"อ" }{ "_id" :7 , "data" :"ง" }
Och här är vad som händer när vi använder $strLenBytes
till dessa dokument:
db.thai.aggregate( [ { $project:{ _id:0, data:1, result:{ $strLenBytes:"$data" } } ])
Resultat:
{ "data" :"ไม้เมือง", "result" :24 }{ "data" :"ไ", "result" :3 }{ "data" :"ม้", "result" :6 }{ "data" :"เ", "result" :3 }{ "data" :"มื", "result" :6 }{ "data" :"อ", "result" :3 }{ "data" :" ง", "result" :3 }
Två av dessa tecken har modifierats med diakritiska tecken, vilket resulterar i att 6 byte returneras.
Andra tecken
Anta att vi har en samling som heter other
med följande dokument:
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }Och låt oss tillämpa
$strLenBytes
till dessa dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
{ "data" :"é", "result" :2 }{ "data" :"©", "result" :2 }{ "data" :"℘", "result" :3 }De två första tecknen är 2 byte och det tredje är 3 byte. Antalet byte beror på tecknet. Vissa tecken kan använda 4 byte.
Mellanslagstecknet använder en byte. Två blanksteg använder därför 2 byte, och så vidare.
Anta att vi har följande dokument:
{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }Och vi tillämpar
$strLenBytes
till dessa dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
{ "data" :" ", "result" :1 }{ "data" :" ", "result" :2 }Tömma strängar
Tomma strängar returnerar
0
.Här är ett dokument med en tom sträng:
{ "_id" :6, "data" :"" }Och här är vad som händer när vi använder
$strLenBytes
till det dokumentet:db.other.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
{ "data" :"", "result" :0 }Fel datatyp
Att skicka fel datatyp resulterar i ett fel.
Anta att vi har följande dokument:
{ "_id" :7, "data" :123 }Data
field
innehåller ett nummer.Låt oss tillämpa
$strLenBytes
till det dokumentet:db.other.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
Fel:kommando misslyckades:{ "ok" :0, "errmsg" :"$strLenBytes kräver ett strängargument, hittade:dubbel", "code" :34473, "codeName" :"Location34473"} :aggregering misslyckades :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1Nullvärden
Tillhandahåller
null
resulterar också i ett fel.Anta att vi har följande dokument:
{ "_id" :8, "data" :null }Data
field
innehållernull
.Låt oss tillämpa
$strLenBytes
till det dokumentet:db.other.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
oupptäckt undantag:Fel:kommando misslyckades:{ "ok" :0, "errmsg" :"$strLenBytes kräver ett strängargument, hittat:null", "code" :34473, "codeName" :"Location34473"} :sammanställning misslyckades :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639 :[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12 @(skal):1:1Fält saknas
Att fortsätta med temat att skapa fel, att specificera ett icke-existerande fält ger också ett fel.
Dokument:
{ "_id" :9 }Använd
$strLenBytes
:db.other.aggregate( [ { $match: { _id: { $in: [ 9 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
Fel:kommando misslyckades:{ "ok" :0, "errmsg" :"$strLenBytes kräver ett strängargument, hittades:saknas", "code" :34473, "codeName" :"Location34473"} :aggregering misslyckades :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1