sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $konvertera

I MongoDB kan du använda $convert aggregeringspipeline-operatör för att konvertera ett värde till en specificerad typ.

Du kan konvertera vilket giltigt uttryck som helst till en dubbel, sträng, ObjectId, boolean, Datum, heltal, lång eller decimal.

Alla typer kan inte konverteras till någon annan typ. Vissa typer kan endast konverteras från en delmängd av de tillgängliga MongoDB-typerna. Du kan till exempel inte konvertera ett datum till ett heltal.

Du kan valfritt använda onError parameter för att ange vad som ska returneras i händelse av ett fel. Du kan valfritt använda onNull parameter för att ange vad som ska returneras om inmatningsvärdet är null eller saknas.

Exempeldata

Anta att vi har en samling som heter samples med följande dokument:

{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "double" :123.75, "string" :"123", "boolean" :true, "date" :ISODate("2020-12-301T23:15.123Z"), "integer" :123, "long" :NumberLong(123), "decimal" :NumberDecimal("123.75"), "datestring" :"2021-02-15 06:53:55"} 

Följande exempel visar hur man konverterar varje fält till andra typer.

Konvertera ObjectId till String

_id fältet i ovanstående dokument är ett ObjectId. Här är ett exempel på att konvertera ObjectId till en sträng.

db.samples.aggregate(
  [
    {
      $project:
        { 
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
).pretty() 

Resultat:

{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "result" :"6011e471c8eb4369cf6ad9d5"}

Resultatet är att den hexadecimala strängen från ObjectId returneras som en sträng.

Konvertera dubbelt till heltal

När du konverterar en dubbel till ett heltal, returneras det trunkerade värdet.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :123 }

Det trunkerade dubbelvärdet måste falla inom minimi- och maximivärdet för ett heltal. Om det inte gör det kommer ett fel att uppstå.

Du kan inte heller konvertera ett dubbelvärde vars trunkerade värde är mindre än det lägsta heltalsvärdet eller är större än det maximala heltalsvärdet.

Konvertera sträng till heltal

När du konverterar en sträng till ett heltal, $convert returnerar strängens numeriska värde som ett heltal.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :123 }

Strängvärdet måste vara en bas10 heltal (t.ex. "-123" , "123" ) och faller inom minimi- och maximivärdet för ett heltal.

Konvertera booleskt till heltal

När du konverterar ett booleskt tal till ett heltal, $convert returnerar 1 för ett booleskt värde på true och 0 för ett booleskt värde på false .

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$boolean", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "resultat" :1 }

Konvertera datum till sträng

Du kan använda $convert för att returnera ett datum som en sträng.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$date", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :"2020-12-31T23:30:15.123Z" }

Date-objektet har konverterats till en sträng.

Konvertera dubbel till datum

Följande typer kan konverteras till ett datum:

  • dubbel
  • decimal
  • lång
  • sträng
  • ObjectId

Här är ett exempel på hur du konverterar en dubbel till ett datum:

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :ISODate("1970-01-01T00:00:00.123Z") } 

När du konverterar siffror till ett datum representerar talet antalet millisekunder sedan 1 januari 1970.

I vårt exempel angav vi ett dubbelt värde på 123 , vilket tolkades som 123 millisekunder sedan 1 januari 1970.

Konvertera heltal till decimal

Här är ett exempel på att konvertera ett heltal till decimal:

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$integer", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :NumberDecimal("123.000000000000") } 

Konvertera sträng till datum

Här är ett exempel på att konvertera en datum-/tidssträng till ett Date-objekt:

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$datestring", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :ISODate("2021-02-15T06:53:55Z") } 

När du konverterar en sträng till ett Date-objekt måste strängen vara en giltig datumsträng, till exempel:

  • 2021-02-15
  • 2021-02-15T06:53:55
  • 2021-02-15T06:53:55Z

Konvertera till Boolean

När du konverterar ett värde till ett booleskt värde blir resultatet true eller false , beroende på inmatningsvärdet.

I allmänhet, för numeriska värden, returnerar detta false om värdet är noll (0 ), och true för något annat värde.

För sträng-, ObjectId- och Date-värden returnerar den alltid true .

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "bool",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :sant }

onError Parameter

Du kan använda onError parameter för att returnera ett specificerat värde i händelse av att ett fel uppstår.

Anta att vi har en samling som heter dogs med följande dokument:

{ "_id" :1, "name" :"Wag", "born" :"Mars 2020", "weight" :null }

Nedan är ett exempel på hur du försöker göra en konvertering som misslyckas på grund av ett fel. I det första exemplet gör vi inte använd onError .

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int"
            }
          }
        }
    }
  ]
) 

Resultat:

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 

Det resulterade i att ett otäckt felmeddelande visades.

Följande exempel visar hur vi kan göra detta snyggare genom att använda onError parameter.

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :"Ett fel uppstod" }

Observera att vi fortfarande får dokumentet tillbaka och vårt anpassade felmeddelande visas i fältet.

onNull Parameter

Du kan valfritt använda onNull parameter för att ange vad som ska returneras om inmatningsvärdet är null eller saknas.

Med det föregående dokumentet kan vi testa onNull parameter så här:

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$weight", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Resultat:

{ "result" :"Indata var null eller tom" }


  1. MongoDB Multikey Index &Index Intersection Bounds

  2. Apache HBase I/O – HFile

  3. MongoDB - Skapa en samling

  4. MongoDB $atan2