В MongoDB, $rtrim
Операторът на тръбопровода за агрегиране премахва празно пространство от края на низ. Това включва нулевия символ.
Може също да премахне всеки посочен знак. Например, можете да го използвате, за да премахнете всички точки (.
), удивителни знаци (!
) и т.н. от края на низ.
Пример
Да предположим, че имаме колекция, наречена pets
със следния документ:
{ "_id" : 1, "name" : "Wag!!!", "type" : " Dog ", "weight" : 20 }
Можем да видим, че type
полето включва празно пространство от двете страни на думата Dog
. Можем да използваме $rtrim
оператор, за да върне това поле с премахнато празно пространство от дясната част на низа.
Пример:
db.pets.aggregate([
{
$project: {
name: 1,
type: { $rtrim: { input: "$type" } }
}
}
])
Резултат:
{ "_id" : 1, "name" : "Wag!!!", "type" : " Dog" }
Както се очакваше, type
полето е върнато без празното пространство в края. Пробелът в началото все още остава.
Можете също да използвате $ltrim
оператор за отрязване на лявата част на низа и $trim
оператор за отрязване на двете страни на низа.
Има доста знаци, които MongoDB счита за символи за интервал. Вижте MongoDB Whitespace Characters за пълен списък.
Отрежете други знаци
$rtrim
операторът приема chars
параметър, който ви позволява да посочите кои знаци да отрежете.
Пример:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!" } }
}
}
])
Резултат:
{ "_id" : 1, "name" : "Wag" }
В този случай включихме chars
параметър с удивителен знак (!
), което доведе до премахването на трите удивителни знака от края на низа.
Отрязване на няколко знака
Можете да отрежете няколко знака, като ги включите всички в chars
аргумент.
Пример:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!g" } }
}
}
])
Резултат:
{ "_id" : 1, "name" : "Wa" }
В този случай предоставих два знака като мои chars
аргумент и два от тези символа се оказаха в края на низа. Следователно тези два знака бяха подрязани.
Въпреки това, бъдете внимателни, когато правите това. Ето какво се случва, когато включа всички знаци:
db.pets.aggregate([
{
$project: {
name: { $rtrim: { input: "$name", chars: "!agW" } }
}
}
])
Резултат:
{ "_id" : 1, "name" : "" }
Целият низ е изчезнал. Той е отрязал не само !
и g
от низа, но също така е премахнал W
и a
знаци.
Подрязване на числа
$rtrim
операторът работи върху низове. Ако се опитаме да отрежем weight
поле получаваме грешка. Това е така, защото weight
полето е число, а не низ.
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $rtrim: { input: "$weight", chars: "0" } }
}
}
])
Резултат:
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
Грешката ни казва, че сме предоставили двоен и че $rtrim
операторът изисква въвеждането му да бъде низ.
Ако наистина искаме да премахнем нулата, първо трябва да я преобразуваме в низ. Можем да направим това или с $convert
или $toString
оператор.
Пример:
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } }
}
}
])
Резултат:
{ "_id" : 1, "name" : "Wag!!!", "weight" : "2" }
Можем да го върнем към двоен, като използваме или $convert
или $toDouble
оператор.
Пълен пример:
db.pets.aggregate([
{
$project: {
name: 1,
weight: { $toDouble: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } } }
}
}
])
Резултат:
{ "_id" : 1, "name" : "Wag!!!", "weight" : 2 }