В 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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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"
}
}
}
}
]
) Резултат:
{ "резултат" :"Въведеното е нулево или празно" }