MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $strLenCP

MongoDB, $strLenCP Operator potoku agregacji zwraca liczbę punktów kodowych UTF-8 w określonym ciągu.

$strLenCP operator jest inny niż $strLenBytes operator, który zwraca liczbę bajtów w ciągu.

Przykład

Załóżmy, że mamy kolekcję o nazwie english z następującymi dokumentami:

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

Możemy zastosować $strLenCP do pola danych w tych dokumentach:

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

Wynik:

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

Widzimy, że całe słowo używa 8 punktów kodowych, a każdy znak używa jednego punktu kodowego.

Znaki tajskie

Oto przykład, który używa znaków tajskich, z których każdy ma 3 bajty, ale używa tylko jednego punktu kodowego.

Mamy kolekcję o nazwie thai z następującymi dokumentami:

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

A oto, co się dzieje, gdy zastosujemy $strLenCP do tych dokumentów:

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

Wynik:

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

Dwa z tych znaków zostały zmodyfikowane za pomocą znaków diakrytycznych, co skutkuje zwróceniem 2 punktów kodowych. Te znaki zwracają 6 bajtów przy użyciu $strLenBytes operator.

Inne postacie

Załóżmy, że mamy kolekcję o nazwie other z następującymi dokumentami:

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

I zastosujmy $strLenCP do tych dokumentów:

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

Wynik:

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

Każdy z tych znaków używa jednego punktu kodowego (nawet jeśli takie znaki używają więcej niż jednego bajtu).

Znak spacji używa punktu kodowego. Dlatego dwa znaki spacji używają 2 punktów kodowych i tak dalej.

Załóżmy, że mamy następujące dokumenty:

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

I stosujemy $strLenCP do tych dokumentów:

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

Wynik:

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

Puste ciągi

Puste ciągi zwracają 0 .

Oto dokument z pustym ciągiem:

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

A oto, co się dzieje, gdy zastosujemy $strLenCP do tego dokumentu:

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

Wynik:

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

Niewłaściwy typ danych

Przekazanie nieprawidłowego typu danych skutkuje błędem.

Załóżmy, że mamy następujący dokument:

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

Dane field zawiera numer.

Zastosujmy $strLenCP do tego dokumentu:

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

Wynik:

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

Wartości puste

Podanie null powoduje również błąd.

Załóżmy, że mamy następujący dokument:

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

Dane field zawiera null .

Zastosujmy $strLenCP do tego dokumentu:

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

Wynik:

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

Brakujące pola

Kontynuując temat tworzenia błędów, określenie nieistniejącego pola również powoduje błąd.

Dokument:

{ "_id" : 9 }

Zastosuj $strLenCP :

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

Wynik:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak połączyć się z wdrożeniami MongoDB za pomocą GUI Robo 3T?

  2. Konkretny miesiąc zapytania Mongodb | rok nie data

  3. MongoDB $abs

  4. Automatyczna kopia zapasowa MongoDB

  5. mongodb $w limicie