sql >> Database >  >> NoSQL >> MongoDB

MongoDB $substrCP

In MongoDB, de $substrCP aggregatiepijplijnoperator retourneert de subtekenreeks van een tekenreeks, gebaseerd op de opgegeven UTF-8-codepuntindexen.

Syntaxis

De syntaxis gaat als volgt:

{ $substrCP: [ <string expression>, <code point index>, <code point count> ] }

Waar:

  • <string expression> is de snaar. Het kan elke geldige uitdrukking zijn, zolang deze maar wordt omgezet in een tekenreeks.
  • <code point index> is waar de subtekenreeks moet beginnen. Het kan elke geldige uitdrukking zijn, zolang deze maar wordt omgezet in een niet-negatief geheel getal.
  • <code point count> is voor hoeveel codepunten de substring moet doorgaan. Het kan elke geldige uitdrukking zijn, zolang deze maar wordt omgezet in een niet-negatief geheel getal of getal dat kan worden weergegeven als een geheel getal.

Voorbeeld

Stel je voor dat we een verzameling hebben met de naam tests met het volgende document:

{ "_id" : 1, "data" : "Red Firetruck" }

We kunnen $substrCP . gebruiken zoals dit:

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

Resultaat:

{ "data" : "Red Firetruck", "result" : "Red" }

De index begint bij nul, en dus begon onze substring aan het begin van de string, en ging door voor drie codepunten.

In dit geval gebruiken we Engelse karakters en elk karakter heeft één codepunt. Dit maakt het voor ons gemakkelijk om te tellen hoeveel codepunten we moeten gebruiken.

Laten we nog een voorbeeld geven:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result_1: { $substrCP: [ "$data", 4, 4 ] },
            result_2: { $substrCP: [ "$data", 8, 5 ] },
            result_3: { $substrCP: [ "$data", 8, 20 ] }
          }
     }
   ]
).pretty()

Resultaat:

{
	"data" : "Red Firetruck",
	"result_1" : "Fire",
	"result_2" : "truck",
	"result_3" : "truck"
}

Merk op dat we in ons derde resultaat meer codepunten hebben gespecificeerd dan beschikbaar waren, maar alle tekens werden teruggestuurd naar het einde van de tekenreeks.

Diakritische tekens

Sommige tekens hebben een diakritisch teken toegevoegd, wat resulteert in meerdere codepunten.

Stel dat we een verzameling hebben met de naam thai die de volgende documenten bevat:

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

Deze documenten bevatten Thaise karakters. We kunnen zien dat twee van deze tekens een diakritisch teken bevatten (een kleine glyph boven de eerste glyph).

Documenten 2 t/m 7 geven eenvoudigweg elk van de karakters weer die in document 1 voorkomen.

Laten we, voordat we een subtekenreeks nemen, eens kijken hoeveel codepunten elk van deze tekens heeft met behulp van de $strLenCP operator:

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 }

We kunnen zien dat de twee karakters met de diakritische tekens twee codepunten hebben en de anderen één codepunt.

Laten we $substrCP toepassen naar het eerste document:

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

Resultaat:

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

Gebaseerd op ons uitgangspunt van 1 en ons aantal codepunten van 2 , krijgen we het tweede teken en het bijbehorende diakritische teken.

Scheid de symbolen

In het vorige voorbeeld was ons derde argument 2, zodat het karakter en diakritische tekens samen werden geretourneerd. Dit is wat er gebeurt als we een derde argument van 1 geven.

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

Resultaat:

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

Het eerste teken wordt geretourneerd zonder het diakritische teken.

Andere gegevenstypen

De $substrCP operator werkt alleen op strings. Als u echter een ander gegevenstype heeft, zou het nog steeds moeten werken, zolang het maar kan worden omgezet in een tekenreeks.

Stel dat we het volgende document hebben:

{ "_id" : 2, "data" : 123456 }

De data veld bevat een nummer.

Dit is wat er gebeurt als we $substrCP toepassen naar dat veld:

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

Resultaat:

{ "data" : 123456, "result" : "23" }

Het is erin geslaagd om het werk goed te doen (hoewel je er rekening mee moet houden dat het resultaat een string is – geen nummer).

We hebben nog een document met een Date-object:

{ "_id" : 3, "data" : ISODate("2021-01-03T23:30:15.100Z") }

Laten we nu $substrCP toepassen naar dat document:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $substrCP: [ "$data", 0, 4 ] }
          }
     }
   ]
)

Resultaat:

{ "data" : ISODate("2021-01-03T23:30:15.100Z"), "result" : "2021" }

Dus het werkte ook prima in dit scenario.

Null-waarden

Als de tekenreeks null is , het resultaat is een lege string.

Stel dat we het volgende document hebben:

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

Dit is wat er gebeurt als we $substrCP toepassen naar dat document:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $substrCP: [ "$data", 1, 2 ] }
          }
     }
   ]
)

Resultaat:

{ "data" : null, "result" : "" }

Ontbrekend veld

Pogingen om een ​​subtekenreeks op te halen uit een veld dat niet bestaat, resulteert in een lege tekenreeks.

Stel dat we het volgende document hebben:

{ "_id" : 5 } 

Pas $substrCP toe :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $substrCP: [ "$data", 1, 2 ] }
          }
     }
   ]
)

Resultaat:

{ "result" : "" }


  1. Mangoeste bevolken vs object nesten

  2. MongoDB C#:ID-serialisatie beste patroon

  3. Aan de slag met ClusterControl

  4. MongoDB $count Aggregation Operator