W MongoDB $rtrim
Operator potoku agregacji usuwa białe znaki z końca ciągu. Obejmuje to znak null.
Może również usunąć dowolny określony znak. Na przykład możesz go użyć do usunięcia wszystkich kropek (.
), wykrzykniki (!
) itp. od końca ciągu.
Przykład
Załóżmy, że mamy kolekcję o nazwie pets
z następującym dokumentem:
{ "_id" : 1, "name" : "Wag!!!", "type" : " Dog ", "weight" : 20 }
Widzimy, że type
pole zawiera białe znaki po obu stronach słowa Dog
. Możemy użyć $rtrim
operatora, aby zwrócić to pole z usuniętą spacją z prawej części ciągu.
Przykład:
db.pets.aggregate([
{
$project: {
name: 1,
type: { $rtrim: { input: "$type" } }
}
}
])
Wynik:
{ "_id" : 1, "name" : "Wag!!!", "type" : " Dog" }
Zgodnie z oczekiwaniami type
pole zostało zwrócone bez spacji na końcu. Biała spacja na początku nadal pozostaje.
Możesz także użyć $ltrim
operator do przycinania lewej części łańcucha i $trim
operatora, aby przyciąć obie strony łańcucha.
Istnieje wiele znaków, które MongoDB uważa za znaki odstępu. Zobacz pełną listę znaków odstępu MongoDB.
Przytnij inne znaki
$rtrim
operator akceptuje chars
parametr, który pozwala określić, które znaki należy przyciąć.
Przykład:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!" } }
}
}
])
Wynik:
{ "_id" : 1, "name" : "Wag" }
W tym przypadku dołączyliśmy chars
parametr z wykrzyknikiem (!
), co spowodowało usunięcie wszystkich trzech wykrzykników z końca ciągu.
Przytnij wiele znaków
Możesz przyciąć wiele znaków, umieszczając je wszystkie w chars
argument.
Przykład:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!g" } }
}
}
])
Wynik:
{ "_id" : 1, "name" : "Wa" }
W tym przypadku podałem dwa znaki jako moje chars
argument, a dwa z tych znaków znalazły się na końcu ciągu. Dlatego te dwie postacie zostały przycięte.
Bądź jednak ostrożny, kiedy to robisz. Oto, co się dzieje, gdy uwzględnię wszystkie znaki:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!agW" } }
}
}
])
Wynik:
{ "_id" : 1, "name" : "" }
Zniknął cały ciąg. Przyciął nie tylko !
i g
z ciągu, ale usunięto również W
i a
znaków.
Liczby przycinające
$rtrim
operator działa na ciągach. Jeśli spróbujemy przyciąć weight
pole, otrzymujemy błąd. Dzieje się tak, ponieważ weight
pole jest liczbą, a nie ciągiem.
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $rtrim: { input: "$weight", chars: "0" } }
}
}
])
Wynik:
Error: command failed: { "ok" : 0, "errmsg" : "$rtrim requires its input to be a string, got 20 (of type double) instead.", "code" : 50699, "codeName" : "Location50699" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Błąd informuje nas, że podaliśmy double i że $rtrim
operator wymaga, aby jego dane wejściowe były ciągiem.
Gdybyśmy naprawdę chcieli usunąć zero, musielibyśmy najpierw przekonwertować je na łańcuch. Możemy to zrobić za pomocą $convert
lub $toString
operatora.
Przykład:
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } }
}
}
])
Wynik:
{ "_id" : 1, "name" : "Wag!!!", "weight" : "2" }
Możemy przywrócić to do podwójnego za pomocą $convert
lub $toDouble
operatora.
Pełny przykład:
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $toDouble: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } } }
}
}
])
Wynik:
{ "_id" : 1, "name" : "Wag!!!", "weight" : 2 }