sql >> Database >  >> NoSQL >> MongoDB

MongoDB $converteren

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" }


  1. HBase en Hive – Samen beter

  2. Hoe zaai ik een mongo-database met behulp van docker-compose?

  3. Hoe zoek ik naar een object op zijn ObjectId in de mongo-console?

  4. Kan Redis 6 profiteren van multi-core CPU's?