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

MongoDB $strLenBytes

MongoDB, il $strLenBytes l'operatore della pipeline di aggregazione restituisce il numero di byte con codifica UTF-8 nella stringa specificata.

Ogni carattere in una stringa può contenere un numero diverso di byte, a seconda del carattere utilizzato. Il $strLenBytes l'operatore può capire quanti byte contiene ogni carattere e restituire il risultato corretto per l'intera 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 $strLenBytes al campo dati in quei documenti:

db.english.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenBytes: "$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 è di 8 byte e ogni carattere è di 1 byte ciascuno.

Personaggi tailandesi

Ecco un esempio che utilizza caratteri tailandesi, che sono 3 byte ciascuno.

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 $strLenBytes a quei documenti:

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

Risultato:

{ "data" : "ไม้เมือง", "result" : 24 }
{ "data" : "ไ", "result" : 3 }
{ "data" : "ม้", "result" : 6 }
{ "data" : "เ", "result" : 3 }
{ "data" : "มื", "result" : 6 }
{ "data" : "อ", "result" : 3 }
{ "data" : "ง", "result" : 3 }

Due di questi caratteri sono stati modificati utilizzando segni diacritici, che hanno come risultato la restituzione di 6 byte.

Altri personaggi

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

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

E applichiamo $strLenBytes a quei documenti:

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

Risultato:

{ "data" : "é", "result" : 2 }
{ "data" : "©", "result" : 2 }
{ "data" : "℘", "result" : 3 }

I primi due caratteri sono 2 byte e il terzo è 3 byte. Il numero di byte dipende dal carattere. Alcuni caratteri possono utilizzare 4 byte.

Il carattere spazio utilizza un byte. Due caratteri spazio utilizzano quindi 2 byte e così via.

Supponiamo di avere i seguenti documenti:

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

E applichiamo $strLenBytes a quei documenti:

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenBytes: "$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 $strLenBytes a quel documento:

db.other.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenBytes: "$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 $strLenBytes a quel documento:

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

Risultato:

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

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 $strLenBytes a quel documento:

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

Risultato:

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

Campi mancanti

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

Documento:

{ "_id" : 9 }

Applica $strLenBytes :

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

Risultato:

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