W MongoDB możesz użyć $convert
operator potoku agregacji do konwersji wartości na określony typ.
Możesz przekonwertować dowolne poprawne wyrażenie na podwójne, łańcuchowe, ObjectId, logiczne, Date, integer, long lub dziesiętne.
Nie wszystkie typy można przekonwertować na dowolny inny typ. Niektóre typy można konwertować tylko z podzbioru dostępnych typów MongoDB. Na przykład nie możesz przekonwertować daty na liczbę całkowitą.
Możesz opcjonalnie użyć onError
parametr, aby określić, co zwrócić w przypadku błędu. Możesz opcjonalnie użyć onNull
parametr, aby określić, co zwrócić, jeśli wartość wejściowa jest pusta lub jej brakuje.
Przykładowe dane
Załóżmy, że mamy kolekcję o nazwie samples
z następującym dokumentem:
{ "_id" : ObjectId("6011e471c8eb4369cf6ad9d5"), "double" : 123.75, "string" : "123", "boolean" : true, "date" : ISODate("2020-12-31T23:30:15.123Z"), "integer" : 123, "long" : NumberLong(123), "decimal" : NumberDecimal("123.75"), "datestring" : "2021-02-15 06:53:55" }
Poniższe przykłady pokazują, jak przekonwertować każde pole na inne typy.
Konwertuj identyfikator obiektu na ciąg
_id
pole w powyższym dokumencie to ObjectId. Oto przykład konwersji ObjectId na ciąg.
db.samples.aggregate(
[
{
$project:
{
result:
{
$convert: {
input: "$_id",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
).pretty()
Wynik:
{ "_id" : ObjectId("6011e471c8eb4369cf6ad9d5"), "result" : "6011e471c8eb4369cf6ad9d5" }
W rezultacie ciąg szesnastkowy z ObjectId jest zwracany jako ciąg.
Konwertuj podwójną na liczbę całkowitą
Kiedy konwertujesz liczbę podwójną na liczbę całkowitą, zwracana jest obcięta wartość.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : 123 }
Obcięta wartość double musi mieścić się w minimalnej i maksymalnej wartości liczby całkowitej. Jeśli nie, wystąpi błąd.
Ponadto nie można przekonwertować wartości podwójnej, której obcięta wartość jest mniejsza niż minimalna wartość całkowita lub większa niż maksymalna wartość całkowita.
Konwertuj ciąg na liczbę całkowitą
Kiedy konwertujesz łańcuch na liczbę całkowitą, $convert
zwraca wartość liczbową ciągu jako liczbę całkowitą.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : 123 }
Wartość ciągu musi być podstawą10 liczba całkowita (np. "-123"
, "123"
) i mieszczą się w minimalnej i maksymalnej wartości liczby całkowitej.
Konwertuj wartość logiczną na liczbę całkowitą
Kiedy konwertujesz wartość logiczną na liczbę całkowitą, $convert
zwraca 1
dla wartości logicznej true
i 0
dla wartości logicznej false
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$boolean",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : 1 }
Konwertuj datę na ciąg
Możesz użyć $convert
aby zwrócić datę jako ciąg znaków.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$date",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : "2020-12-31T23:30:15.123Z" }
Obiekt Date został przekonwertowany na ciąg.
Konwertuj podwójnie na datę
Następujące typy można przekonwertować na datę:
- podwójne
- dziesiętny
- długi
- ciąg
- Identyfikator obiektu
Oto przykład konwersji dubletu na datę:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : ISODate("1970-01-01T00:00:00.123Z") }
Kiedy konwertujesz liczby na datę, liczba reprezentuje liczbę milisekund od 1 stycznia 1970 roku.
W naszym przykładzie podaliśmy podwójną wartość 123
, co zostało zinterpretowane jako 123 milisekundy od 1 stycznia 1970 roku.
Konwertuj liczbę całkowitą na dziesiętną
Oto przykład konwersji liczby całkowitej na dziesiętną:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$integer",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : NumberDecimal("123.000000000000") }
Konwertuj ciąg na datę
Oto przykład konwersji ciągu daty/godziny na obiekt Date:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$datestring",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : ISODate("2021-02-15T06:53:55Z") }
Gdy konwertujesz ciąg na obiekt Date, ciąg musi być prawidłowym ciągiem daty, na przykład:
- 2021-02-15
- 2021-02-15T06:53:55
- 2021-02-15T06:53:55Z
Konwertuj na Boole'a
Gdy przekonwertujesz wartość na wartość logiczną, wynikiem będzie true
lub false
, w zależności od wartości wejściowej.
Ogólnie, dla wartości numerycznych zwróci false
jeśli wartość wynosi zero (0
) i true
dla każdej innej wartości.
W przypadku wartości typu string, ObjectId i Date zawsze zwróci true
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "bool",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : true }
onError
Parametr
Możesz użyć onError
parametr, aby zwrócić określoną wartość w przypadku wystąpienia błędu.
Załóżmy, że mamy kolekcję o nazwie dogs
z następującym dokumentem:
{ "_id" : 1, "name" : "Wag", "born" : "March 2020", "weight" : null }
Poniżej znajduje się przykład próby wykonania konwersji, która nie powiodła się z powodu błędu. W pierwszym przykładzie nie użyj onError
.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int"
}
}
}
}
]
)
Wynik:
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
Spowodowało to wyświetlenie paskudnego komunikatu o błędzie.
Poniższy przykład pokazuje, jak możemy to ulepszyć, używając onError
parametr.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : "An error occurred" }
Zauważ, że nadal otrzymujemy zwrócony dokument, a nasz niestandardowy komunikat o błędzie jest wyświetlany w polu.
onNull
Parametr
Możesz opcjonalnie użyć onNull
parametr, aby określić, co zwrócić, jeśli wartość wejściowa jest pusta lub jej brakuje.
Korzystając z poprzedniego dokumentu, możemy przetestować onNull
parametr taki jak ten:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Wynik:
{ "result" : "Input was null or empty" }