In MongoDB kunt u de $convert
. gebruiken aggregatiepijplijnoperator om een waarde om te zetten naar een gespecificeerd type.
U kunt elke geldige expressie converteren naar een double, string, ObjectId, boolean, Date, integer, long of decimaal.
Niet alle typen kunnen worden geconverteerd naar een ander type. Sommige typen kunnen alleen worden geconverteerd vanuit een subset van de beschikbare MongoDB-typen. U kunt bijvoorbeeld een datum niet converteren naar een geheel getal.
U kunt optioneel de onError
. gebruiken parameter om op te geven wat er moet worden geretourneerd in het geval van een fout. U kunt optioneel de onNull
. gebruiken parameter om op te geven wat moet worden geretourneerd als de invoerwaarde null is of ontbreekt.
Voorbeeldgegevens
Stel dat we een verzameling hebben met de naam samples
met het volgende document:
{ "_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" }
De volgende voorbeelden laten zien hoe u elk veld naar andere typen kunt converteren.
Converteer ObjectId naar String
De _id
veld in het bovenstaande document is een ObjectId. Hier is een voorbeeld van het converteren van de ObjectId naar een string.
db.samples.aggregate(
[
{
$project:
{
result:
{
$convert: {
input: "$_id",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
).pretty()
Resultaat:
{ "_id" : ObjectId("6011e471c8eb4369cf6ad9d5"), "result" : "6011e471c8eb4369cf6ad9d5" }
Het resultaat is dat de hexadecimale tekenreeks van de ObjectId als tekenreeks wordt geretourneerd.
Dubbel naar geheel getal converteren
Als je een double omzet in een geheel getal, wordt de afgekapte waarde geretourneerd.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : 123 }
De afgekapte dubbele waarde moet binnen de minimum- en maximumwaarde voor een geheel getal vallen. Als dit niet het geval is, zal er een fout optreden.
U kunt ook geen dubbele waarde converteren waarvan de afgekapte waarde kleiner is dan de minimale integerwaarde of groter is dan de maximale integerwaarde.
Tekenreeks converteren naar geheel getal
Als je een string converteert naar een geheel getal, $convert
geeft de numerieke waarde van de string terug als een geheel getal.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : 123 }
De tekenreekswaarde moet een grondtal10 . zijn geheel getal (bijv. "-123"
, "123"
) en vallen binnen de minimum- en maximumwaarde voor een geheel getal.
Boolean converteren naar geheel getal
Wanneer u een boolean converteert naar een geheel getal, $convert
retourneert 1
voor een booleaanse waarde van true
, en 0
voor een booleaanse waarde van false
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$boolean",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : 1 }
Converteer datum naar tekenreeks
U kunt $convert
. gebruiken om een datum als een tekenreeks te retourneren.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$date",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : "2020-12-31T23:30:15.123Z" }
Het Date-object is geconverteerd naar een string.
Double naar datum converteren
De volgende typen kunnen worden omgezet naar een datum:
- dubbel
- decimaal
- lang
- tekenreeks
- Object-ID
Hier is een voorbeeld van het converteren van een dubbel naar een datum:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : ISODate("1970-01-01T00:00:00.123Z") }
Als je getallen naar een datum converteert, staat het getal voor het aantal milliseconden sinds 1 januari 1970.
In ons voorbeeld hebben we een dubbele waarde van 123
. opgegeven , wat werd geïnterpreteerd als 123 milliseconden sinds 1 januari 1970.
Geheel getal converteren naar decimaal
Hier is een voorbeeld van het converteren van een geheel getal naar decimaal:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$integer",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : NumberDecimal("123.000000000000") }
Tekenreeks converteren naar datum
Hier is een voorbeeld van het converteren van een datum/tijd-tekenreeks naar een Date-object:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$datestring",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : ISODate("2021-02-15T06:53:55Z") }
Wanneer u een tekenreeks naar een Date-object converteert, moet de tekenreeks een geldige datumtekenreeks zijn, zoals:
- 2021-02-15
- 202-02-15T06:53:55
- 202-02-15T06:53:55Z
Converteren naar Booleaans
Als u een waarde naar een boolean converteert, is het resultaat true
of false
, afhankelijk van de invoerwaarde.
Over het algemeen levert dit voor numerieke waarden false
op als de waarde nul is (0
), en true
voor elke andere waarde.
Voor string-, ObjectId- en Date-waarden wordt altijd true
geretourneerd .
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "bool",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : true }
De onError
Parameter
U kunt de onError
. gebruiken parameter om een gespecificeerde waarde te retourneren in het geval dat er een fout optreedt.
Stel dat we een verzameling hebben met de naam dogs
met het volgende document:
{ "_id" : 1, "name" : "Wag", "born" : "March 2020", "weight" : null }
Hieronder ziet u een voorbeeld van een poging om een conversie uit te voeren die mislukt vanwege een fout. In het eerste voorbeeld doen we niet gebruik onError
.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int"
}
}
}
}
]
)
Resultaat:
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
Dat resulteerde in een vervelende foutmelding die werd weergegeven.
Het volgende voorbeeld laat zien hoe we dit leuker kunnen maken door gebruik te maken van de onError
parameter.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : "An error occurred" }
Merk op dat we het document nog steeds terugkrijgen en dat onze aangepaste foutmelding in het veld wordt weergegeven.
De onNull
Parameter
U kunt optioneel de onNull
. gebruiken parameter om op te geven wat moet worden geretourneerd als de invoerwaarde null is of ontbreekt.
Met behulp van het vorige document kunnen we de onNull
. testen parameter als deze:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultaat:
{ "result" : "Input was null or empty" }