V MongoDB můžete použít $convert
operátor agregačního kanálu pro převod hodnoty na určený typ.
Jakýkoli platný výraz můžete převést na dvojitý, řetězec, ObjectId, boolean, datum, celé číslo, dlouhé nebo desetinné číslo.
Ne všechny typy lze převést na jakýkoli jiný typ. Některé typy lze převést pouze z podmnožiny dostupných typů MongoDB. Nemůžete například převést datum na celé číslo.
Volitelně můžete použít onError
parametr určující, co se má vrátit v případě chyby. Volitelně můžete použít onNull
parametr určující, co se má vrátit, pokud je vstupní hodnota null nebo chybí.
Ukázková data
Předpokládejme, že máme kolekci nazvanou samples
s následujícím dokumentem:
{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "double" :123,75, "string" :"123", "boolean" :true, "date" :ISODate("2020-12-31T23:3 15.123Z"), "integer" :123, "long" :NumberLong(123), "decimal" :NumberDecimal("123.75"), "datestring" :"2021-02-15 06:53:55"}Následující příklady ukazují, jak převést každé pole na jiné typy.
Převést ObjectId na String
_id
pole ve výše uvedeném dokumentu je ObjectId. Zde je příklad převodu ObjectId na řetězec.db.samples.aggregate( [ { $project: { result: { $convert: { input: "$_id", to: "string", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] ).pretty()
Výsledek:
{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "result" :"6011e471c8eb4369cf6ad9d5"}Výsledkem je, že hexadecimální řetězec z ObjectId je vrácen jako řetězec.
Převést double na celé číslo
Když převedete double na celé číslo, vrátí se zkrácená hodnota.
db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$double", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Výsledek:
{ "výsledek" :123 }Zkrácená hodnota double musí spadat do minimální a maximální hodnoty pro celé číslo. Pokud se tak nestane, dojde k chybě.
Také nelze převést dvojitou hodnotu, jejíž zkrácená hodnota je menší než minimální celočíselná hodnota nebo je větší než maximální celočíselná hodnota.
Převést řetězec na celé číslo
Když převádíte řetězec na celé číslo,
$convert
vrátí číselnou hodnotu řetězce jako celé číslo.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$string", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Výsledek:
{ "výsledek" :123 }Hodnota řetězce musí být základní10 celé číslo (např.
"-123"
,"123"
) a spadají do minimální a maximální hodnoty pro celé číslo.Převést booleovské hodnoty na celé číslo
Když převedete boolean na celé číslo,
$convert
vrátí1
pro booleovskou hodnotutrue
a0
pro booleovskou hodnotufalse
.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$boolean", to: "int", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Výsledek:
{ "výsledek" :1 }Převést datum na řetězec
Můžete použít
$convert
vrátit datum jako řetězec.db.samples.aggregate( [ { $project: { _id: 0, result: { $convert: { input: "$date", to: "string", onError: "An error occurred", onNull: "Input was null or empty" } } } } ] )
Výsledek:
{ "result" :"2020-12-31T23:30:15.123Z" }Objekt Date byl převeden na řetězec.
Převést dvojnásobek na datum
Následující typy lze převést na datum:
- dvojitá
- desítkové
- dlouhé
- řetězec
- ObjectId
Zde je příklad převodu double na datum:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Výsledek:
{ "výsledek" :ISODate("1970-01-01T00:00:00.123Z") }
Když převedete čísla na datum, číslo představuje počet milisekund od 1. ledna 1970.
V našem příkladu jsme poskytli dvojnásobnou hodnotu 123
, což bylo interpretováno jako 123 milisekund od 1. ledna 1970.
Převést celé číslo na desítkové
Zde je příklad převodu celého čísla na desítkové:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$integer",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Výsledek:
{ "výsledek" :NumberDecimal("123.000000000000") }
Převést řetězec na datum
Zde je příklad převodu řetězce data/času na objekt Date:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$datestring",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Výsledek:
{ "result" :ISODate("2021-02-15T06:53:55Z") }
Při převodu řetězce na objekt Date musí být řetězec platným datem, například:
- 2021-02-15
- 2021-02-15T06:53:55
- 2021-02-15T06:53:55Z
Převést na logickou hodnotu
Když převedete hodnotu na booleovskou hodnotu, výsledek bude true
nebo false
, v závislosti na vstupní hodnotě.
Obecně platí, že pro číselné hodnoty to vrátí false
pokud je hodnota nula (0
) a true
pro jakoukoli jinou hodnotu.
Pro hodnoty string, ObjectId a Date vždy vrátí true
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "bool",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Výsledek:
{ "výsledek" :true }
onError
Parametr
Můžete použít onError
parametr vrátí zadanou hodnotu v případě, že dojde k chybě.
Předpokládejme, že máme sbírku nazvanou dogs
s následujícím dokumentem:
{ "_id" :1, "name" :"Wag", "born" :"březen 2020", "váha" :null }
Níže je uveden příklad pokusu o provedení převodu, který selže kvůli chybě. V prvním příkladu neděláme použijte onError
.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int"
}
}
}
}
]
)
Výsledek:
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
To vedlo k zobrazení nepříjemné chybové zprávy.
Následující příklad ukazuje, jak to můžeme vylepšit pomocí onError
parametr.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Výsledek:
{ "výsledek" :"Došlo k chybě" }
Všimněte si, že se nám stále vrací dokument a v poli se zobrazí naše vlastní chybová zpráva.
onNull
Parametr
Volitelně můžete použít onNull
parametr určující, co se má vrátit, pokud je vstupní hodnota null nebo chybí.
Pomocí předchozího dokumentu můžeme otestovat onNull
parametr takto:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Výsledek:
{ "result" :"Vstup byl prázdný nebo prázdný" }