MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $strLenCP

MongoDB, das $strLenCP Der Aggregations-Pipeline-Operator gibt die Anzahl der UTF-8-Codepunkte in der angegebenen Zeichenfolge zurück.

Der $strLenCP Operator unterscheidet sich von $strLenBytes -Operator, der die Anzahl der Bytes im String zurückgibt.

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 $strLenCP anwenden zum Datenfeld in diesen Dokumenten:

db.english.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$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 Codepunkte und jedes Zeichen einen Codepunkt verwendet.

Thailändische Schriftzeichen

Hier ist ein Beispiel, das thailändische Zeichen verwendet, die jeweils 3 Bytes groß sind, aber nur einen Codepunkt verwenden.

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 $strLenCP anwenden zu diesen Dokumenten:

db.thai.aggregate( [ { $project:{ _id:0, data:1, result:{ $strLenCP:"$data" } } } ])

Ergebnis:

{ "data" :"ไม้เมือง", "result" :8 }{ "data" :"ไ", "result" :1 }{ "data" :"ม้", "result" :2 }{ „Daten“ :„เ“, „Ergebnis“ :1 }{ „Daten“ :„มื“, „Ergebnis“ :2 }{ „Daten“ :„อ“, „Ergebnis“ :1 }{ „Daten“ :„ §", "Ergebnis" :1 }

Zwei dieser Zeichen wurden mit diakritischen Zeichen geändert, was dazu führt, dass zwei Codepunkte zurückgegeben werden. Diese Zeichen geben 6 Bytes zurück, wenn $strLenBytes verwendet wird Operator.

Andere Charaktere

Angenommen, wir haben eine Sammlung namens other mit folgenden Dokumenten:

{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" } 

Und wenden wir $strLenCP an zu diesen Dokumenten:

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$data" }
          }
     }
   ]
) 

Ergebnis:

{ "Daten" :"é", "Ergebnis" :1 }{ "Daten" :"©", "Ergebnis" :1 }{ "Daten" :"℘", "Ergebnis" :1 } 

Jedes dieser Zeichen verwendet einen einzelnen Codepunkt (auch wenn solche Zeichen mehr als ein Byte verwenden).

Das Leerzeichen verwendet einen Codepunkt. Zwei Leerzeichen verwenden also 2 Codepunkte usw.

Angenommen, wir haben die folgenden Dokumente:

{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }

Und wir wenden $strLenCP an zu diesen Dokumenten:

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$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 $strLenCP anwenden zu diesem Dokument:

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$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 $strLenCP an zu diesem Dokument:

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$data" }
          }
     }
   ]
) 

Ergebnis:

nicht erfasste Ausnahme:Fehler:Befehl fehlgeschlagen:{ "ok" :0, "errmsg" :"$strLenCP benötigt ein Zeichenfolgenargument, gefunden:doppelt", "code" :34471, "codeName" :"Location34471"} :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:1

Nullwerte

Bereitstellung von null führt ebenfalls zu einem Fehler.

Angenommen, wir haben das folgende Dokument:

{ "_id" :8, "data" :null }

Das Datenfeld field enthält null .

Wenden wir $strLenCP an zu diesem Dokument:

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 8 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$data" }
          }
     }
   ]
) 

Ergebnis:

Fehler:Befehl fehlgeschlagen:{ "ok" :0, "errmsg" :"$strLenCP benötigt ein String-Argument, gefunden:null", "code" :34471, "codeName" :"Location34471"} :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

Fehlende 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 $strLenCP an :

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 9 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$data" }
          }
     }
   ]
) 

Ergebnis:

Fehler:Befehl fehlgeschlagen:{ "ok" :0, "errmsg" :"$strLenCP benötigt ein String-Argument, gefunden:fehlt", "code" :34471, "codeName" :"Location34471"} :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