MongoDB, de $strLenCP
aggregatiepijplijnoperator retourneert het aantal UTF-8-codepunten in de opgegeven tekenreeks.
De $strLenCP
operator is anders dan de $strLenBytes
operator, die het aantal bytes in de tekenreeks retourneert.
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 $strLenCP
. toepassen naar het gegevensveld in die documenten:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$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 codepunten gebruikt en dat elk teken één codepunt gebruikt.
Thaise tekens
Hier is een voorbeeld dat Thaise karakters gebruikt, die elk 3 bytes zijn, maar slechts één codepunt gebruiken.
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 $strLenCP
toepassen naar die documenten:
db.thai.aggregate( [ { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Resultaat:
{ "data" : "ไม้เมือง", "result" : 8 } { "data" : "ไ", "result" : 1 } { "data" : "ม้", "result" : 2 } { "data" : "เ", "result" : 1 } { "data" : "มื", "result" : 2 } { "data" : "อ", "result" : 1 } { "data" : "ง", "result" : 1 }
Twee van deze karakters zijn aangepast met diakritische tekens, waardoor er 2 codepunten worden geretourneerd. Deze tekens retourneren 6 bytes bij gebruik van de $strLenBytes
exploitant.
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 $strLenCP
toepassen naar die documenten:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Resultaat:
{ "data" : "é", "result" : 1 } { "data" : "©", "result" : 1 } { "data" : "℘", "result" : 1 }
Elk van deze tekens gebruikt een enkel codepunt (ook al gebruiken dergelijke tekens meer dan één byte).
Het spatieteken gebruikt een codepunt. Twee spatietekens gebruiken dus 2 codepunten, enzovoort.
Stel dat we de volgende documenten hebben:
{ "_id" : 4, "data" : " " } { "_id" : 5, "data" : " " }
En we passen $strLenCP
toe naar die documenten:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$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 $strLenCP
toepassen naar dat document:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$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 $strLenCP
toepassen naar dat document:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Resultaat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$strLenCP requires a string argument, found: double", "code" : 34471, "codeName" : "Location34471" } : 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 $strLenCP
toepassen naar dat document:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Resultaat:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenCP requires a string argument, found: null", "code" : 34471, "codeName" : "Location34471" } : 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 }
$strLenCP
toepassen :
db.other.aggregate(
[
{ $match: { _id: { $in: [ 9 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Resultaat:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenCP requires a string argument, found: missing", "code" : 34471, "codeName" : "Location34471" } : 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