sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $konvertovat

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 hodnotu true a 0 pro booleovskou hodnotu false .

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


  1. Jak MongoDB objednává své dokumenty v jedné kolekci?

  2. Mongodb najít vytvořené výsledky podle data dnes

  3. Redis je jednovláknový, jak tedy dělá souběžné I/O?

  4. Jak změnit typ pole?