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

MongoDB $strLenBytes

MongoDB, $strLenBytes Operator potoku agregacji zwraca liczbę bajtów zakodowanych w formacie UTF-8 w określonym ciągu.

Każdy znak w ciągu może zawierać inną liczbę bajtów, w zależności od używanego znaku. $strLenBytes operator może określić, ile bajtów zawiera każdy znak i zwrócić poprawny wynik dla całego łańcucha.

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ć $strLenBytes do pola danych w tych dokumentach:

db.english.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $strLenBytes: "$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 ma 8 bajtów, a każdy znak ma 1 bajt.

Znaki tajskie

Oto przykład, który używa znaków tajskich, każdy o długości 3 bajtów.

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 $strLenBytes do tych dokumentów:

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

Wynik:

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

Dwa z tych znaków zostały zmodyfikowane za pomocą znaków diakrytycznych, co skutkuje zwróceniem 6 bajtów.

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 $strLenBytes do tych dokumentów:

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

Wynik:

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

Pierwsze dwa znaki to 2 bajty, a trzeci to 3 bajty. Liczba bajtów zależy od znaku. Niektóre znaki mogą używać 4 bajtów.

Znak spacji używa bajtu. Dlatego dwie spacje używają 2 bajtów i tak dalej.

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

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

I stosujemy $strLenBytes do tych dokumentów:

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

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

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

Wynik:

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

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 $strLenBytes do tego dokumentu:

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

Wynik:

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

Brakujące pola

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

Dokument:

{ "_id" : 9 }

Zastosuj $strLenBytes :

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

Wynik:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB jako usługa systemu Windows i konfiguracja zestawu repliki

  2. BsonSerializationException podczas serializacji Dictionary<DateTime,T> do BSON

  3. Stwórz stronę internetową sklepu spożywczego za pomocą Angular, NodeJS, Express i MongoDB

  4. Wypełnij model mangusty polem, które nie jest identyfikatorem

  5. paginacja tablicy mongoDB