MongoDB, $strLenBytes Операторът на конвейера за агрегиране връща броя на кодираните UTF-8 байтове в посочения низ.
Всеки знак в низ може да съдържа различен брой байтове, в зависимост от използвания знак. $strLenBytes операторът може да разбере колко байта съдържа всеки знак и да върне правилния резултат за целия низ.
Пример
Да предположим, че имаме колекция, наречена english със следните документи:
{ "_id" :1, "data" :"Maimuang" }{ "_id" :2, "data" :"M" }{ "_id" :3, "data" :"a" }{ " _id" :4, "data" :"i" }{ "_id" :5, "data" :"m" }{ "_id" :6, "data" :"u" }{ "_id" :7, "data" :"a" }{ "_id" :8, "data" :"n" }{ "_id" :9, "data" :"g" }
Можем да приложим $strLenBytes към полето за данни в тези документи:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
) Резултат:
{ "data" :"Maimuang", "result" :8 }{ "data" :"M", "result" :1 }{ "data" :"a", "result" :1 }{ " данни" :"i", "резултат" :1 }{ "данни" :"m", "резултат" :1 }{ "данни" :"u", "резултат" :1 }{ "данни" :"a ", "резултат" :1 }{ "данни" :"n", "резултат" :1 }{ "данни" :"g", "резултат" :1 } Можем да видим, че цялата дума е 8 байта и всеки знак е по 1 байт.
Тайландски знаци
Ето пример, който използва тайландски знаци, които са по 3 байта всеки.
Имаме колекция, наречена thai със следните документи:
{ "_id" :1, "data" :"ไม้เมือง" }{ "_id" :2, "data" :"ไ" }{ "_id" :3, "data" :"ม้" }{ "_id" :4, "data" :"เ" }{ "_id" :5, "data" :"มื" }{ "_id" :6, "data" :"อ" }{ "_id" :7 , "данни" :"ง" }
И ето какво се случва, когато приложим $strLenBytes към тези документи:
db.thai.aggregate( [ { $project:{ _id:0, данни:1, резултат:{ $strLenBytes:"$data" } } ]) Резултат:
{ "данни" :"ไม้เมือง", "резултат" :24 }{ "данни" :"ไ", "резултат" :3 }{ "данни" :"ม้", "резултат" :6 }{ "данни" :"เ", "резултат" :3 }{ "данни" :"มื", "резултат" :6 }{ "данни" :"อ", "резултат" :3 }{ "данни" :" ง", "резултат" :3 } Два от тези знака са променени с помощта на диакритика, което води до връщане на 6 байта.
Други символи
Да предположим, че имаме колекция, наречена other със следните документи:
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }предварително>
И нека приложим $strLenBytes към тези документи:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Резултат:
{ "data" :"é", "result" :2 }{ "data" :"©", "result" :2 }{ "data" :"℘", "result" :3 }предварително>
Първите два знака са 2 байта, а третият е 3 байта. Броят на байтовете зависи от знака. Някои знаци могат да използват 4 байта.
Знакът за интервал използва байт. Следователно два знака за интервал използват 2 байта и т.н.
Да предположим, че имаме следните документи:
{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }
И ние прилагаме $strLenBytes към тези документи:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Резултат:
{ "данни" :" ", "резултат" :1 }{ "данни" :" ", "резултат" :2 } Празни низове
Празните низове връщат 0 .
Ето документ с празен низ:
{ "_id" :6, "data" :"" }
И ето какво се случва, когато приложим $strLenBytes към този документ:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Резултат:
{ "данни" :"", "резултат" :0 } Грешен тип данни
Предаването на грешен тип данни води до грешка.
Да предположим, че имаме следния документ:
{ "_id" :7, "data" :123 }
Данните field съдържа число.
Нека приложим $strLenBytes към този документ:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Резултат:
Грешка:командата е неуспешна:{ "ok" :0, "errmsg" :"$strLenBytes изисква низов аргумент, намерен:double", "code" :34473, "codeName" :"Location34473"} :неуспешен агрегат:example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/mongo/shell/collection.js:1058:12@(shell ):1:1 Нулеви стойности
Предоставяне на null също води до грешка.
Да предположим, че имаме следния документ:
{ "_id" :8, "data" :null }
Данните field съдържа null .
Нека приложим $strLenBytes към този документ:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Резултат:
неуловено изключение:Грешка:командата е неуспешна:{ "ok" :0, "errmsg" :"$strLenBytes изисква низов аргумент, намерен:null", "code" :34473, "codeName" :"Location34473"} :неуспешен агрегат :example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert.js:639 :17example@sqldat.com/mongo/shell/assert.js:729:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/mongo/shell/collection.js:1058:12 @(обвивка):1:1 Липсващи полета
Продължавайки с темата за генериране на грешки, посочването на несъществуващо поле също води до грешка.
Документ:
{ "_id" :9 }
Приложете $strLenBytes :
db.other.aggregate(
[
{ $match: { _id: { $in: [ 9 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Резултат:
Грешка:командата е неуспешна:{ "ok" :0, "errmsg" :"$strLenBytes изисква низов аргумент, намерен:липсва", "код" :34473, "codeName" :"Location34473"} :неуспешен агрегат:example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/mongo/shell/collection.js:1058:12@(shell ):1:1