V MongoDB, $rtrim
operátor agregačního kanálu odstraní mezery z konce řetězce. To zahrnuje znak null.
Může také odstranit jakýkoli zadaný znak. Můžete jej například použít k odstranění všech teček (.
), vykřičníky (!
), atd. od konce řetězce.
Příklad
Předpokládejme, že máme sbírku nazvanou pets
s následujícím dokumentem:
{ "_id" : 1, "name" : "Wag!!!", "type" : " Dog ", "weight" : 20 }
Vidíme, že type
pole obsahuje prázdné místo na obou stranách slova Dog
. Můžeme použít $rtrim
operátor vrátí toto pole s odstraněnými mezerami z pravé části řetězce.
Příklad:
db.pets.aggregate([
{
$project: {
name: 1,
type: { $rtrim: { input: "$type" } }
}
}
])
Výsledek:
{ "_id" : 1, "name" : "Wag!!!", "type" : " Dog" }
Jak se očekávalo, type
pole bylo vráceno bez mezer na konci. Prázdné znaky na začátku stále zůstávají.
Můžete také použít $ltrim
operátor pro oříznutí levé části řetězce a $trim
operátor pro oříznutí obou stran řetězce.
Existuje poměrně málo znaků, které MongoDB považuje za znaky s mezerami. Úplný seznam najdete v MongoDB Whitespace Characters.
Oříznout další znaky
$rtrim
operátor přijímá chars
parametr, který umožňuje určit, které znaky se mají oříznout.
Příklad:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!" } }
}
}
])
Výsledek:
{ "_id" : 1, "name" : "Wag" }
V tomto případě jsme zahrnuli chars
parametr s vykřičníkem (!
), což vedlo k odstranění všech tří vykřičníků z konce řetězce.
Oříznout více znaků
Více znaků můžete oříznout tak, že je všechny zahrnete do chars
argument.
Příklad:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!g" } }
}
}
])
Výsledek:
{ "_id" : 1, "name" : "Wa" }
V tomto případě jsem jako chars
uvedl dva znaky argument a dva z těchto znaků byly náhodou na konci řetězce. Proto byly tyto dva znaky oříznuty.
Při tom však buďte opatrní. Když zahrnu všechny znaky, stane se toto:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!agW" } }
}
}
])
Výsledek:
{ "_id" : 1, "name" : "" }
Celý řetězec zmizel. Omezil nejen !
a g
z řetězce, ale také odstranil W
a a
znaky.
Oříznutí čísel
$rtrim
operátor pracuje na řetězcích. Pokud se pokusíme oříznout weight
pole, dostaneme chybu. Důvodem je weight
pole je číslo, nikoli řetězec.
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $rtrim: { input: "$weight", chars: "0" } }
}
}
])
Výsledek:
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
Chyba nám říká, že jsme poskytli double a že $rtrim
operátor vyžaduje, aby jeho vstup byl řetězec.
Pokud bychom opravdu chtěli odstranit nulu, museli bychom ji nejprve převést na řetězec. Můžeme to udělat buď pomocí $convert
nebo $toString
operátor.
Příklad:
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } }
}
}
])
Výsledek:
{ "_id" : 1, "name" : "Wag!!!", "weight" : "2" }
Můžeme to vrátit zpět na dvojnásobek buď pomocí $convert
nebo $toDouble
operátor.
Úplný příklad:
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $toDouble: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } } }
}
}
])
Výsledek:
{ "_id" : 1, "name" : "Wag!!!", "weight" : 2 }