sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $konverter

I MongoDB kan du bruge $convert aggregeringspipeline-operatør for at konvertere en værdi til en specificeret type.

Du kan konvertere ethvert gyldigt udtryk til en dobbelt, streng, ObjectId, boolean, Dato, heltal, lang eller decimal.

Ikke alle typer kan konverteres til andre typer. Nogle typer kan kun konverteres fra en delmængde af de tilgængelige MongoDB-typer. For eksempel kan du ikke konvertere en dato til et heltal.

Du kan valgfrit bruge onError parameter for at angive, hvad der skal returneres i tilfælde af en fejl. Du kan valgfrit bruge onNull parameter for at angive, hvad der skal returneres, hvis inputværdien er nul eller mangler.

Eksempel på data

Antag, at vi har en samling kaldet samples med følgende 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ølgende eksempler viser, hvordan man konverterer hvert felt til andre typer.

Konverter ObjectId til String

_id feltet i ovenstående dokument er et ObjectId. Her er et eksempel på konvertering af ObjectId til en streng.

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 er, at den hexadecimale streng fra ObjectId returneres som en streng.

Konverter dobbelt til heltal

Når du konverterer en dobbelt til et heltal, returneres den trunkerede værdi.

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 }

Den trunkerede dobbeltværdi skal falde inden for minimums- og maksimumværdien for et heltal. Hvis det ikke sker, vil der opstå en fejl.

Du kan heller ikke konvertere en dobbeltværdi, hvis afkortede værdi er mindre end den mindste heltalværdi eller er større end den maksimale heltalsværdi.

Konverter streng til heltal

Når du konverterer en streng til et heltal, $convert returnerer den numeriske værdi af strengen som et 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 }

Strengværdien skal være en base10 heltal (f.eks. "-123" , "123" ) og falder inden for minimums- og maksimumværdien for et heltal.

Konverter Boolean til heltal

Når du konverterer en boolean til et heltal, $convert returnerer 1 for en boolsk værdi på true og 0 for en boolsk værdi 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:

{ "result" :1 }

Konverter dato til streng

Du kan bruge $convert for at returnere en dato som en streng.

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

Dato-objektet er blevet konverteret til en streng.

Konverter dobbelt til dato

Følgende typer kan konverteres til en dato:

  • dobbelt
  • decimal
  • lang
  • streng
  • ObjectId

Her er et eksempel på at konvertere en dobbelt til en dato:

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 konverterer tal til en dato, repræsenterer tallet antallet af millisekunder siden 1. januar 1970.

I vores eksempel har vi angivet en dobbelt værdi på 123 , som blev fortolket som 123 millisekunder siden 1. januar 1970.

Konverter heltal til decimal

Her er et eksempel på konvertering af et heltal til 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") } 

Konverter streng til dato

Her er et eksempel på at konvertere en dato-/tidsstreng til et Dato-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 konverterer en streng til et Dato-objekt, skal strengen være en gyldig datostreng, såsom:

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

Konverter til Boolean

Når du konverterer en værdi til en boolesk værdi, vil resultatet være true eller false , afhængigt af inputværdien.

For numeriske værdier vil dette generelt returnere false hvis værdien er nul (0 ), og true for enhver anden værdi.

For streng-, ObjectId- og Dato-værdier vil den altid returnere 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" :sand }

onError Parameter

Du kan bruge onError parameter for at returnere en specificeret værdi i tilfælde af, at der opstår en fejl.

Antag, at vi har en samling kaldet dogs med følgende dokument:

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

Nedenfor er et eksempel på forsøg på at udføre en konvertering, der mislykkes på grund af en fejl. I det første eksempel gør vi ikke brug 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 resulterede i, at en grim fejlmeddelelse blev vist.

Følgende eksempel viser, hvordan vi kan gøre dette pænere ved at bruge 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" :"Der opstod en fejl" }

Bemærk, at vi stadig får dokumentet retur, og vores brugerdefinerede fejlmeddelelse vises i feltet.

onNull Parameter

Du kan valgfrit bruge onNull parameter for at angive, hvad der skal returneres, hvis inputværdien er nul eller mangler.

Ved at bruge det forrige dokument kan vi teste onNull parameter som denne:

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

Resultat:

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


  1. Mongoose returnerer udefineret for et eksisterende felt

  2. 2 tilgange til sporing af onlinebrugere med Redis. Hvilken er hurtigere?

  3. Hvordan kan jeg kontrollere, om et felt findes eller ej i MongoDB?

  4. Brug mongoexport med en --query for ISODate