sql >> Database >  >> NoSQL >> MongoDB

MongoDB $strLenBytes

MongoDB, de $strLenBytes aggregatiepijplijnoperator retourneert het aantal UTF-8-gecodeerde bytes in de opgegeven tekenreeks.

Elk teken in een tekenreeks kan een ander aantal bytes bevatten, afhankelijk van het teken dat wordt gebruikt. De $strLenBytes operator kan uitzoeken hoeveel bytes elk teken bevat en het juiste resultaat voor de hele string teruggeven.

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 $strLenBytes . toepassen naar het gegevensveld in die documenten:

db.english.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenBytes: "$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 bytes is en dat elk teken 1 byte is.

Thaise tekens

Hier is een voorbeeld dat Thaise karakters gebruikt, die elk 3 bytes zijn.

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 $strLenBytes toepassen naar die documenten:

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

Resultaat:

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

Twee van deze karakters zijn aangepast met diakritische tekens, waardoor 6 bytes worden geretourneerd.

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 $strLenBytes . toepassen naar die documenten:

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

Resultaat:

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

De eerste twee tekens zijn 2 bytes en de derde is 3 bytes. Het aantal bytes is afhankelijk van het teken. Sommige tekens kunnen 4 bytes gebruiken.

Het spatieteken gebruikt een byte. Twee spatietekens gebruiken dus 2 bytes, enzovoort.

Stel dat we de volgende documenten hebben:

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

En we passen $strLenBytes . toe naar die documenten:

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

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

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

Resultaat:

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

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 $strLenBytes . toepassen naar dat document:

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

Resultaat:

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

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 }

Pas $strLenBytes toe :

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

Resultaat:

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

  1. Gegenereerd script in MongoDB C#-stuurprogramma ophalen

  2. Haal het laatste MongoDB-record op per veld van datetime

  3. De top 6 gratis Redis-geheugenanalysetools

  4. Redis installeren op Ubuntu 16.04/18.04