In MongoDB ist die $substrCP
Der Aggregationspipelineoperator gibt die Teilzeichenfolge einer Zeichenfolge basierend auf den angegebenen UTF-8-Codepunktindizes zurück.
Syntax
Die Syntax lautet wie folgt:
{ $substrCP: [ <string expression>, <code point index>, <code point count> ] }
Wo:
<string expression>
ist die Saite. Es kann jeder gültige Ausdruck sein, solange er in einen String aufgelöst wird.<code point index>
ist, wo der Teilstring beginnen soll. Es kann jeder gültige Ausdruck sein, solange er in eine nicht negative ganze Zahl aufgelöst wird.<code point count>
ist, wie viele Codepunkte die Teilzeichenfolge fortgesetzt werden soll. Es kann jeder gültige Ausdruck sein, solange er in eine nicht negative Ganzzahl oder Zahl aufgelöst wird, die als Ganzzahl dargestellt werden kann.
Beispiel
Stellen Sie sich vor, wir haben eine Sammlung namens tests
mit folgendem Dokument:
{ "_id" : 1, "data" : "Red Firetruck" }
Wir können $substrCP
verwenden so:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 3 ] }
}
}
]
)
Ergebnis:
{ "data" : "Red Firetruck", "result" : "Red" }
Der Index beginnt bei Null, und so begann unser Teilstring am Anfang des Strings und wurde für drei Codepunkte fortgesetzt.
In diesem Fall verwenden wir englische Zeichen und jedes Zeichen hat einen Codepunkt. Dadurch können wir leicht zählen, wie viele Codepunkte verwendet werden sollen.
Lassen Sie uns ein weiteres Beispiel ausführen:
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()
Ergebnis:
{ "data" : "Red Firetruck", "result_1" : "Fire", "result_2" : "truck", "result_3" : "truck" }
Beachten Sie, dass wir in unserem dritten Ergebnis mehr Codepunkte angegeben haben, als verfügbar waren, aber es wurden einfach alle Zeichen bis zum Ende der Zeichenfolge zurückgegeben.
Diakritische Zeichen
Einigen Zeichen wurde ein diakritisches Zeichen hinzugefügt, was zu mehreren Codepunkten führt.
Angenommen, wir haben eine Sammlung namens thai
die folgende Dokumente enthält:
{ "_id" : 1, "data" : "ไม้เมือง" } { "_id" : 2, "data" : "ไ" } { "_id" : 3, "data" : "ม้" } { "_id" : 4, "data" : "เ" } { "_id" : 5, "data" : "มื" } { "_id" : 6, "data" : "อ" } { "_id" : 7, "data" : "ง" }
Diese Dokumente enthalten thailändische Schriftzeichen. Wir können sehen, dass zwei dieser Zeichen ein diakritisches Zeichen enthalten (eine kleine Glyphe über der Anfangsglyphe).
Die Dokumente 2 bis 7 listen einfach alle Zeichen aus Dokument 1 auf.
Bevor wir einen Teilstring nehmen, wollen wir herausfinden, wie viele Codepunkte jedes dieser Zeichen hat, indem wir den $strLenCP
verwenden Betreiber:
db.thai.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Ergebnis:
{ "data" : "ไม้เมือง", "result" : 8 } { "data" : "ไ", "result" : 1 } { "data" : "ม้", "result" : 2 } { "data" : "เ", "result" : 1 } { "data" : "มื", "result" : 2 } { "data" : "อ", "result" : 1 } { "data" : "ง", "result" : 1 }
Wir können sehen, dass die beiden Zeichen mit den diakritischen Zeichen zwei Codepunkte haben und die anderen einen Codepunkt.
Wenden wir $substrCP
an zum ersten Dokument:
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Ergebnis:
{ "data" : "ไม้เมือง", "result" : "ม้" }
Basierend auf unserem Ausgangspunkt von 1
und unsere Codepunktzahl von 2
, erhalten wir das zweite Zeichen und das zugehörige diakritische Zeichen.
Trennen Sie die Glyphen
Im vorherigen Beispiel war unser drittes Argument 2, sodass es das Zeichen und das diakritische Zeichen zusammen zurückgab. Folgendes passiert, wenn wir ein drittes Argument von 1 bereitstellen.
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 1 ] }
}
}
]
)
Ergebnis:
{ "data" : "ไม้เมือง", "result" : "ม" }
Das erste Zeichen wird ohne das diakritische Zeichen zurückgegeben.
Andere Datentypen
Der $substrCP
-Operator funktioniert nur mit Zeichenfolgen. Wenn Sie jedoch einen anderen Datentyp haben, sollte es trotzdem funktionieren, solange es in eine Zeichenfolge aufgelöst werden kann.
Angenommen, wir haben das folgende Dokument:
{ "_id" : 2, "data" : 123456 }
Die data
Feld enthält eine Zahl.
Folgendes passiert, wenn wir $substrCP
anwenden zu diesem Feld:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Ergebnis:
{ "data" : 123456, "result" : "23" }
Es hat den Job gut gemacht (obwohl man bedenken sollte, dass das Ergebnis ein String ist – keine Zahl).
Wir haben ein weiteres Dokument mit einem Date-Objekt:
{ "_id" : 3, "data" : ISODate("2021-01-03T23:30:15.100Z") }
Wenden wir nun $substrCP
an zu diesem Dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 4 ] }
}
}
]
)
Ergebnis:
{ "data" : ISODate("2021-01-03T23:30:15.100Z"), "result" : "2021" }
Es hat also auch in diesem Szenario gut funktioniert.
Nullwerte
Wenn die Zeichenfolge null
ist , das Ergebnis ist ein leerer String.
Angenommen, wir haben das folgende Dokument:
{ "_id" : 4, "data" : null }
Folgendes passiert, wenn wir $substrCP
anwenden zu diesem Dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Ergebnis:
{ "data" : null, "result" : "" }
Fehlendes Feld
Der Versuch, eine Teilzeichenfolge aus einem nicht vorhandenen Feld abzurufen, führt zu einer leeren Zeichenfolge.
Angenommen, wir haben das folgende Dokument:
{ "_id" : 5 }
Wenden Sie $substrCP
an :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Ergebnis:
{ "result" : "" }