MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $strLenCP

MongoDB, il $strLenCP l'operatore della pipeline di aggregazione restituisce il numero di punti di codice UTF-8 nella stringa specificata.

Il $strLenCP l'operatore è diverso da $strLenBytes operatore, che restituisce il numero di byte nella stringa.

Esempio

Supponiamo di avere una collezione chiamata english con i seguenti documenti:

{ "_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" }

Possiamo applicare $strLenCP al campo dati in quei documenti:

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

Risultato:

{ "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 }

Possiamo vedere che l'intera parola utilizza 8 punti di codice e ogni carattere utilizza un punto di codice.

Personaggi tailandesi

Ecco un esempio che utilizza caratteri tailandesi, che sono 3 byte ciascuno, ma utilizzano solo un punto di codice.

Abbiamo una collezione chiamata thai con i seguenti documenti:

{ "_id" : 1, "data" : "ไม้เมือง" }
{ "_id" : 2, "data" : "ไ" }
{ "_id" : 3, "data" : "ม้" }
{ "_id" : 4, "data" : "เ" }
{ "_id" : 5, "data" : "มื" }
{ "_id" : 6, "data" : "อ" }
{ "_id" : 7, "data" : "ง" }

Ed ecco cosa succede quando applichiamo $strLenCP a quei documenti:

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

Risultato:

{ "data" : "ไม้เมือง", "result" : 8 }
{ "data" : "ไ", "result" : 1 }
{ "data" : "ม้", "result" : 2 }
{ "data" : "เ", "result" : 1 }
{ "data" : "มื", "result" : 2 }
{ "data" : "อ", "result" : 1 }
{ "data" : "ง", "result" : 1 }

Due di questi caratteri sono stati modificati utilizzando segni diacritici, che si traducono in 2 punti di codice restituiti. Questi caratteri restituiscono 6 byte quando si utilizza $strLenBytes operatore.

Altri personaggi

Supponiamo di avere una collezione chiamata other con i seguenti documenti:

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

E applichiamo $strLenCP a quei documenti:

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

Risultato:

{ "data" : "é", "result" : 1 }
{ "data" : "©", "result" : 1 }
{ "data" : "℘", "result" : 1 }

Ciascuno di questi caratteri utilizza un singolo punto di codice (anche se tali caratteri utilizzano più di un byte).

Il carattere spazio utilizza un punto di codice. Due caratteri spazio utilizzano quindi 2 punti di codice e così via.

Supponiamo di avere i seguenti documenti:

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

E applichiamo $strLenCP a quei documenti:

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

Risultato:

{ "data" : " ", "result" : 1 }
{ "data" : "  ", "result" : 2 }

Stringhe vuote

Le stringhe vuote restituiscono 0 .

Ecco un documento con una stringa vuota:

{ "_id" : 6, "data" : "" }

Ed ecco cosa succede quando applichiamo $strLenCP a quel documento:

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

Risultato:

{ "data" : "", "result" : 0 }

Tipo di dati errato

Il passaggio del tipo di dati errato genera un errore.

Supponiamo di avere il seguente documento:

{ "_id" : 7, "data" : 123 }

Il field dei dati contiene un numero.

Applichiamo $strLenCP a quel documento:

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

Risultato:

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

Valori Nulli

Fornendo null genera anche un errore.

Supponiamo di avere il seguente documento:

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

Il field dei dati contiene null .

Applichiamo $strLenCP a quel documento:

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

Risultato:

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

Campi mancanti

Continuando con il tema della produzione di errori, anche specificare un campo inesistente produce un errore.

Documento:

{ "_id" : 9 }

Applica $strLenCP :

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

Risultato:

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