В MongoDB можете да използвате $convert
оператор на конвейер за агрегиране за преобразуване на стойност в определен тип.
Можете да конвертирате всеки валиден израз в двоен, низ, ObjectId, булев, дата, цяло число, дълъг или десетичен.
Не всички типове могат да бъдат преобразувани в друг тип. Някои типове могат да бъдат конвертирани само от подмножество от наличните типове MongoDB. Например, не можете да преобразувате дата в цяло число.
По желание можете да използвате onError
параметър, за да посочите какво да върнете в случай на грешка. По избор можете да използвате onNull
параметър, за да укажете какво да върнете, ако входната стойност е нула или липсва.
Примерни данни
Да предположим, че имаме колекция, наречена samples
със следния документ:
{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "double" :123.75, "string" :"123", "boolean" :true, "date" :ISODate("2020-230:3-3 15.123Z"), "integer" :123, "long" :NumberLong(123), "decimal" :NumberDecimal("123.75"), "datestring" :"2021-02-15 06:53:55"}предварително>Следните примери демонстрират как да конвертирате всяко поле в други типове.
Преобразуване на ObjectId в String
_id
полето в горния документ е ObjectId. Ето пример за преобразуване на ObjectId в низ.db.samples.aggregate( [ { $project: { result: { $convert: { input: "$_id", to: "string", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] ).pretty()
Резултат:
{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "резултат" :"6011e471c8eb4369cf6ad9d5"}Резултатът е, че шестнадесетичният низ от ObjectId се връща като низ.
Преобразуване двойно в цяло число
Когато преобразувате двойно в цяло число, се връща съкратената стойност.
db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$double", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Резултат:
{ "резултат" :123 }Съкратената двойна стойност трябва да попада в рамките на минималната и максималната стойност за цяло число. Ако това не се случи, ще възникне грешка.
Освен това не можете да конвертирате двойна стойност, чиято съкратена стойност е по-малка от минималната стойност на цяло число или е по-голяма от максималната целочислена стойност.
Преобразуване на низ в цяло число
Когато конвертирате низ в цяло число,
$convert
връща числовата стойност на низа като цяло число.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$string", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Резултат:
{ "резултат" :123 }Стойността на низа трябва да е базова10 цяло число (напр.
"-123"
,"123"
) и попадат в рамките на минималната и максималната стойност за цяло число.Преобразуване на булева в цяло число
Когато конвертирате булева стойност в цяло число,
$convert
връща1
за булева стойностtrue
и0
за булева стойностfalse
.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$boolean", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Резултат:
{ "резултат" :1 }Преобразуване на дата в низ
Можете да използвате
$convert
за да върнете дата като низ.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$date", to: "string", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Резултат:
{ "резултат" :"2020-12-31T23:30:15.123Z" }Обектът Date е преобразуван в низ.
Преобразуване двойно в дата
Следните типове могат да бъдат преобразувани в дата:
- двойно
- десетичен знак
- дълго
- низ
- ObjectId
Ето пример за преобразуване на двойна в дата:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Резултат:
{ "резултат" :ISODate("1970-01-01T00:00:00.123Z") }
Когато преобразувате числа в дата, числото представлява броя милисекунди от 1 януари 1970 г.
В нашия пример предоставихме двойна стойност от 123
, което се интерпретира като 123 милисекунди от 1 януари 1970 г.
Преобразуване на цяло число в десетично число
Ето пример за преобразуване на цяло число в десетично число:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$integer",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Резултат:
{ "резултат" :NumberDecimal("123.000000000000") }
Преобразуване на низ в дата
Ето пример за преобразуване на низ за дата/час в обект Date:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$datestring",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Резултат:
{ "резултат" :ISODate("2021-02-15T06:53:55Z") }
Когато конвертирате низ в обект Date, низът трябва да е валиден низ от дата, като например:
- 15.02.2021
- 2021-02-15T06:53:55
- 2021-02-15T06:53:55Z
Преобразуване в булеви
Когато конвертирате стойност в булева, резултатът ще бъде true
или false
, в зависимост от въведената стойност.
Обикновено за числови стойности това ще върне false
ако стойността е нула (0
) и true
за всяка друга стойност.
За стойностите на string, ObjectId и Date винаги ще връща true
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "bool",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Резултат:
{ "резултат" :вярно }
onError
Параметър
Можете да използвате onError
параметър за връщане на определена стойност в случай, че възникне грешка.
Да предположим, че имаме колекция, наречена dogs
със следния документ:
{ "_id" :1, "name" :"Wag", "born" :"Март 2020", "weight" :null }
По-долу е даден пример за опит за извършване на преобразуване, което е неуспешно поради грешка. В първия пример не го правим използвайте onError
.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int"
}
}
}
}
]
)
Резултат:
Error: command failed: {
"ok" : 0,
"errmsg" : "Failed to parse number 'March 2020' in $convert with no onError value: Did not consume whole string.",
"code" : 241,
"codeName" : "ConversionFailure"
} : 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
Това доведе до показване на неприятно съобщение за грешка.
Следващият пример показва как можем да направим това по-хубаво, като използваме onError
параметър.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Резултат:
{ "резултат" :"Възникна грешка" }
Забележете, че все още получаваме връщането на документа и нашето персонализирано съобщение за грешка се показва в полето.
onNull
Параметър
По избор можете да използвате onNull
параметър, за да укажете какво да върнете, ако входната стойност е нула или липсва.
Използвайки предишния документ, можем да тестваме onNull
параметър като този:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Резултат:
{ "резултат" :"Въведеното е нулево или празно" }