MongoDB, de $strLenBytes
aggregatiepijplijnoperator retourneert het aantal UTF-8-gecodeerde bytes in de opgegeven tekenreeks.
Elk teken in een tekenreeks kan een ander aantal bytes bevatten, afhankelijk van het teken dat wordt gebruikt. De $strLenBytes
operator kan uitzoeken hoeveel bytes elk teken bevat en het juiste resultaat voor de hele string teruggeven.
Voorbeeld
Stel dat we een verzameling hebben met de naam english
met de volgende documenten:
{ "_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" }
We kunnen $strLenBytes
. toepassen naar het gegevensveld in die documenten:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultaat:
{ "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 }
We kunnen zien dat het hele woord 8 bytes is en dat elk teken 1 byte is.
Thaise tekens
Hier is een voorbeeld dat Thaise karakters gebruikt, die elk 3 bytes zijn.
We hebben een collectie genaamd thai
met de volgende documenten:
{ "_id" : 1, "data" : "ไม้เมือง" } { "_id" : 2, "data" : "ไ" } { "_id" : 3, "data" : "ม้" } { "_id" : 4, "data" : "เ" } { "_id" : 5, "data" : "มื" } { "_id" : 6, "data" : "อ" } { "_id" : 7, "data" : "ง" }
En dit is wat er gebeurt als we $strLenBytes
toepassen naar die documenten:
db.thai.aggregate( [ { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultaat:
{ "data" : "ไม้เมือง", "result" : 24 } { "data" : "ไ", "result" : 3 } { "data" : "ม้", "result" : 6 } { "data" : "เ", "result" : 3 } { "data" : "มื", "result" : 6 } { "data" : "อ", "result" : 3 } { "data" : "ง", "result" : 3 }
Twee van deze karakters zijn aangepast met diakritische tekens, waardoor 6 bytes worden geretourneerd.
Andere karakters
Stel dat we een verzameling hebben met de naam other
met de volgende documenten:
{ "_id" : 1, "data" : "é" } { "_id" : 2, "data" : "©" } { "_id" : 3, "data" : "℘" }
En laten we $strLenBytes
. toepassen naar die documenten:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultaat:
{ "data" : "é", "result" : 2 } { "data" : "©", "result" : 2 } { "data" : "℘", "result" : 3 }
De eerste twee tekens zijn 2 bytes en de derde is 3 bytes. Het aantal bytes is afhankelijk van het teken. Sommige tekens kunnen 4 bytes gebruiken.
Het spatieteken gebruikt een byte. Twee spatietekens gebruiken dus 2 bytes, enzovoort.
Stel dat we de volgende documenten hebben:
{ "_id" : 4, "data" : " " } { "_id" : 5, "data" : " " }
En we passen $strLenBytes
. toe naar die documenten:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultaat:
{ "data" : " ", "result" : 1 } { "data" : " ", "result" : 2 }
Lege snaren
Lege tekenreeksen retourneren 0
.
Hier is een document met een lege string:
{ "_id" : 6, "data" : "" }
En dit is wat er gebeurt als we $strLenBytes
toepassen naar dat document:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultaat:
{ "data" : "", "result" : 0 }
Onjuist gegevenstype
Het doorgeven van het verkeerde gegevenstype resulteert in een fout.
Stel dat we het volgende document hebben:
{ "_id" : 7, "data" : 123 }
Het gegevens field
bevat een nummer.
Laten we $strLenBytes
. toepassen naar dat document:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultaat:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenBytes requires a string argument, found: double", "code" : 34473, "codeName" : "Location34473" } : 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
Null-waarden
null
opgeven resulteert ook in een fout.
Stel dat we het volgende document hebben:
{ "_id" : 8, "data" : null }
Het gegevens field
bevat null
.
Laten we $strLenBytes
. toepassen naar dat document:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultaat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$strLenBytes requires a string argument, found: null", "code" : 34473, "codeName" : "Location34473" } : 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
Ontbrekende velden
Als we doorgaan met het thema van het produceren van fouten, levert het specificeren van een niet-bestaand veld ook een fout op.
Document:
{ "_id" : 9 }
Pas $strLenBytes
toe :
db.other.aggregate(
[
{ $match: { _id: { $in: [ 9 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultaat:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenBytes requires a string argument, found: missing", "code" : 34473, "codeName" : "Location34473" } : 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