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