sql >> Database >  >> NoSQL >> MongoDB

MongoDB $strLenCP

MongoDB, de $strLenCP aggregatiepijplijnoperator retourneert het aantal UTF-8-codepunten in de opgegeven tekenreeks.

De $strLenCP operator is anders dan de $strLenBytes operator, die het aantal bytes in de tekenreeks retourneert.

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

db.english.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenCP: "$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 codepunten gebruikt en dat elk teken één codepunt gebruikt.

Thaise tekens

Hier is een voorbeeld dat Thaise karakters gebruikt, die elk 3 bytes zijn, maar slechts één codepunt gebruiken.

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

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

Resultaat:

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

Twee van deze karakters zijn aangepast met diakritische tekens, waardoor er 2 codepunten worden geretourneerd. Deze tekens retourneren 6 bytes bij gebruik van de $strLenBytes exploitant.

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

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

Resultaat:

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

Elk van deze tekens gebruikt een enkel codepunt (ook al gebruiken dergelijke tekens meer dan één byte).

Het spatieteken gebruikt een codepunt. Twee spatietekens gebruiken dus 2 codepunten, enzovoort.

Stel dat we de volgende documenten hebben:

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

En we passen $strLenCP toe naar die documenten:

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

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

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

Resultaat:

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

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

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

Resultaat:

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

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 }

$strLenCP toepassen :

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

Resultaat:

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

  1. Mangoesten vullen geneste array

  2. Kan geen verbinding maken met Mongo Cloud mongodb Database in Golang op Ubuntu

  3. Converteer DBObject naar een POJO met MongoDB Java Driver

  4. MongoDB $setIsSubset