MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $konwertuj

W MongoDB możesz użyć $convert operator potoku agregacji do konwersji wartości na określony typ.

Możesz przekonwertować dowolne poprawne wyrażenie na podwójne, łańcuchowe, ObjectId, logiczne, Date, integer, long lub dziesiętne.

Nie wszystkie typy można przekonwertować na dowolny inny typ. Niektóre typy można konwertować tylko z podzbioru dostępnych typów MongoDB. Na przykład nie możesz przekonwertować daty na liczbę całkowitą.

Możesz opcjonalnie użyć onError parametr, aby określić, co zwrócić w przypadku błędu. Możesz opcjonalnie użyć onNull parametr, aby określić, co zwrócić, jeśli wartość wejściowa jest pusta lub jej brakuje.

Przykładowe dane

Załóżmy, że mamy kolekcję o nazwie samples z następującym dokumentem:

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

Poniższe przykłady pokazują, jak przekonwertować każde pole na inne typy.

Konwertuj identyfikator obiektu na ciąg

_id pole w powyższym dokumencie to ObjectId. Oto przykład konwersji ObjectId na ciąg.

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

Wynik:

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

W rezultacie ciąg szesnastkowy z ObjectId jest zwracany jako ciąg.

Konwertuj podwójną na liczbę całkowitą

Kiedy konwertujesz liczbę podwójną na liczbę całkowitą, zwracana jest obcięta wartość.

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

Wynik:

{ "result" : 123 }

Obcięta wartość double musi mieścić się w minimalnej i maksymalnej wartości liczby całkowitej. Jeśli nie, wystąpi błąd.

Ponadto nie można przekonwertować wartości podwójnej, której obcięta wartość jest mniejsza niż minimalna wartość całkowita lub większa niż maksymalna wartość całkowita.

Konwertuj ciąg na liczbę całkowitą

Kiedy konwertujesz łańcuch na liczbę całkowitą, $convert zwraca wartość liczbową ciągu jako liczbę całkowitą.

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

Wynik:

{ "result" : 123 }

Wartość ciągu musi być podstawą10 liczba całkowita (np. "-123" , "123" ) i mieszczą się w minimalnej i maksymalnej wartości liczby całkowitej.

Konwertuj wartość logiczną na liczbę całkowitą

Kiedy konwertujesz wartość logiczną na liczbę całkowitą, $convert zwraca 1 dla wartości logicznej true i 0 dla wartości logicznej false .

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

Wynik:

{ "result" : 1 }

Konwertuj datę na ciąg

Możesz użyć $convert aby zwrócić datę jako ciąg znaków.

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

Wynik:

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

Obiekt Date został przekonwertowany na ciąg.

Konwertuj podwójnie na datę

Następujące typy można przekonwertować na datę:

  • podwójne
  • dziesiętny
  • długi
  • ciąg
  • Identyfikator obiektu

Oto przykład konwersji dubletu na datę:

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

Wynik:

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

Kiedy konwertujesz liczby na datę, liczba reprezentuje liczbę milisekund od 1 stycznia 1970 roku.

W naszym przykładzie podaliśmy podwójną wartość 123 , co zostało zinterpretowane jako 123 milisekundy od 1 stycznia 1970 roku.

Konwertuj liczbę całkowitą na dziesiętną

Oto przykład konwersji liczby całkowitej na dziesiętną:

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

Wynik:

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

Konwertuj ciąg na datę

Oto przykład konwersji ciągu daty/godziny na obiekt Date:

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

Wynik:

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

Gdy konwertujesz ciąg na obiekt Date, ciąg musi być prawidłowym ciągiem daty, na przykład:

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

Konwertuj na Boole'a

Gdy przekonwertujesz wartość na wartość logiczną, wynikiem będzie true lub false , w zależności od wartości wejściowej.

Ogólnie, dla wartości numerycznych zwróci false jeśli wartość wynosi zero (0 ) i true dla każdej innej wartości.

W przypadku wartości typu string, ObjectId i Date zawsze zwróci true .

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

Wynik:

{ "result" : true }

onError Parametr

Możesz użyć onError parametr, aby zwrócić określoną wartość w przypadku wystąpienia błędu.

Załóżmy, że mamy kolekcję o nazwie dogs z następującym dokumentem:

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

Poniżej znajduje się przykład próby wykonania konwersji, która nie powiodła się z powodu błędu. W pierwszym przykładzie nie użyj onError .

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

Wynik:

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

Spowodowało to wyświetlenie paskudnego komunikatu o błędzie.

Poniższy przykład pokazuje, jak możemy to ulepszyć, używając onError parametr.

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

Wynik:

{ "result" : "An error occurred" }

Zauważ, że nadal otrzymujemy zwrócony dokument, a nasz niestandardowy komunikat o błędzie jest wyświetlany w polu.

onNull Parametr

Możesz opcjonalnie użyć onNull parametr, aby określić, co zwrócić, jeśli wartość wejściowa jest pusta lub jej brakuje.

Korzystając z poprzedniego dokumentu, możemy przetestować onNull parametr taki jak ten:

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

Wynik:

{ "result" : "Input was null or empty" }


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak mogę sprawdzić, czy pole istnieje, czy nie w MongoDB?

  2. MongoDB $mergeObjects

  3. Seryjne iterowanie po kursorze mongodb (oczekiwanie na wywołania zwrotne przed przejściem do następnego dokumentu)

  4. MongoDB:Serwer ma ostrzeżenia o uruchomieniu

  5. Mongoose findOneAndUpdate i runValidators nie działają