MongoDB, die $strLenBytes
Der Aggregations-Pipeline-Operator gibt die Anzahl der UTF-8-codierten Bytes in der angegebenen Zeichenfolge zurück.
Jedes Zeichen in einer Zeichenfolge kann je nach verwendetem Zeichen eine unterschiedliche Anzahl von Bytes enthalten. Die $strLenBytes
Der Operator kann herausfinden, wie viele Bytes jedes Zeichen enthält, und das richtige Ergebnis für die gesamte Zeichenfolge zurückgeben.
Beispiel
Angenommen, wir haben eine Sammlung namens english
mit folgenden Dokumenten:
{ "_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, "Daten" :"a" }{ "_id" :8, "Daten" :"n" }{ "_id" :9, "Daten" :"g" }
Wir können $strLenBytes
anwenden zum Datenfeld in diesen Dokumenten:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Ergebnis:
{ "Daten" :"Maimuang", "Ergebnis" :8 }{ "Daten" :"M", "Ergebnis" :1 }{ "Daten" :"a", "Ergebnis" :1 }{ " data“ :„i“, „result“ :1 }{ „data“ :„m“, „result“ :1 }{ „data“ :„u“, „result“ :1 }{ „data“ :„a ", "Ergebnis" :1 }{ "Daten" :"n", "Ergebnis" :1 }{ "Daten" :"g", "Ergebnis" :1 }
Wir können sehen, dass das ganze Wort 8 Byte groß ist und jedes Zeichen 1 Byte groß ist.
Thailändische Schriftzeichen
Hier ist ein Beispiel, das thailändische Zeichen verwendet, die jeweils 3 Bytes groß sind.
Wir haben eine Sammlung namens thai
mit folgenden Dokumenten:
{ "_id" :1, "data" :"ไม้เมือง" }{ "_id" :2, "data" :"ไ" }{ "_id" :3, "data" :"ม้" }{ „_id“ :4, „data“ :„เ“ }{ „_id“ :5, „data“ :„มื“ }{ „_id“ :6, „data“ :„อ“ }{ „_id“ :7 , "Daten":"§" }
Und das passiert, wenn wir $strLenBytes
anwenden zu diesen Dokumenten:
db.thai.aggregate( [ { $project:{ _id:0, data:1, result:{ $strLenBytes:"$data" } } } ])
Ergebnis:
{ "data" :"ไม้เมือง", "result" :24 }{ "data" :"ไ", "result" :3 }{ "data" :"ม้", "result" :6 }{ „Daten“ :„เ“, „Ergebnis“ :3 }{ „Daten“ :„มื“, „Ergebnis“ :6 }{ „Daten“ :„อ“, „Ergebnis“ :3 }{ „Daten“ :„ §", "Ergebnis" :3 }
Zwei dieser Zeichen wurden mit diakritischen Zeichen modifiziert, was dazu führt, dass 6 Bytes zurückgegeben werden.
Andere Charaktere
Angenommen, wir haben eine Sammlung namens other
mit folgenden Dokumenten:
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }Und wenden wir
$strLenBytes
an zu diesen Dokumenten:db.other.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Ergebnis:
{ "Daten" :"é", "Ergebnis" :2 }{ "Daten" :"©", "Ergebnis" :2 }{ "Daten" :"℘", "Ergebnis" :3 }Die ersten beiden Zeichen sind 2 Bytes und das dritte 3 Bytes. Die Anzahl der Bytes hängt vom Zeichen ab. Einige Zeichen können 4 Bytes verwenden.
Das Leerzeichen verwendet ein Byte. Zwei Leerzeichen verbrauchen also 2 Bytes usw.
Angenommen, wir haben die folgenden Dokumente:
{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }Und wir wenden
$strLenBytes
an zu diesen Dokumenten:db.other.aggregate( [ { $match: { _id: { $in: [ 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Ergebnis:
{ "Daten" :" ", "Ergebnis" :1 }{ "Daten" :" ", "Ergebnis" :2 }Leere Zeichenfolgen
Leere Strings geben
0
zurück .Hier ist ein Dokument mit einer leeren Zeichenfolge:
{ "_id" :6, "data" :"" }Und das passiert, wenn wir
$strLenBytes
anwenden zu diesem Dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Ergebnis:
{ "Daten" :"", "Ergebnis" :0 }Falscher Datentyp
Das Übergeben des falschen Datentyps führt zu einem Fehler.
Angenommen, wir haben das folgende Dokument:
{ "_id" :7, "daten" :123 }Das Datenfeld
field
enthält eine Zahl.Wenden wir
$strLenBytes
an zu diesem Dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Ergebnis:
Fehler:Befehl fehlgeschlagen:{ "ok" :0, "errmsg" :"$strLenBytes erfordert ein String-Argument, gefunden:double", "code" :34473, "codeName" :"Location34473"} :Aggregat fehlgeschlagen :[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:1Nullwerte
Bereitstellung von
null
führt ebenfalls zu einem Fehler.Angenommen, wir haben das folgende Dokument:
{ "_id" :8, "data" :null }Das Datenfeld
field
enthältnull
.Wenden wir
$strLenBytes
an zu diesem Dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Ergebnis:
nicht erfasste Ausnahme:Fehler:Befehl fehlgeschlagen:{ "ok" :0, "errmsg" :"$strLenBytes erfordert ein Zeichenfolgenargument, gefunden:null", "code" :34473, "codeName" :"Location34473"} :Aggregat fehlgeschlagen :[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 @(Schale):1:1Fehlende Felder
Um mit dem Thema der Erzeugung von Fehlern fortzufahren, die Angabe eines nicht vorhandenen Felds erzeugt ebenfalls einen Fehler.
Dokument:
{ "_id" :9 }Wenden Sie
$strLenBytes
an :db.other.aggregate( [ { $match: { _id: { $in: [ 9 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Ergebnis:
Fehler:Befehl fehlgeschlagen:{ "ok" :0, "errmsg" :"$strLenBytes erfordert ein String-Argument, gefunden:fehlt", "code" :34473, "codeName" :"Location34473"} :Aggregat fehlgeschlagen :[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