MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $ конвертиране

В MongoDB можете да използвате $convert оператор на конвейер за агрегиране за преобразуване на стойност в определен тип.

Можете да конвертирате всеки валиден израз в двоен, низ, ObjectId, булев, дата, цяло число, дълъг или десетичен.

Не всички типове могат да бъдат преобразувани в друг тип. Някои типове могат да бъдат конвертирани само от подмножество от наличните типове MongoDB. Например, не можете да преобразувате дата в цяло число.

По желание можете да използвате onError параметър, за да посочите какво да върнете в случай на грешка. По избор можете да използвате onNull параметър, за да укажете какво да върнете, ако входната стойност е нула или липсва.

Примерни данни

Да предположим, че имаме колекция, наречена samples със следния документ:

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

Следните примери демонстрират как да конвертирате всяко поле в други типове.

Преобразуване на ObjectId в String

_id полето в горния документ е ObjectId. Ето пример за преобразуване на ObjectId в низ.

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

Резултат:

{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "резултат" :"6011e471c8eb4369cf6ad9d5"}

Резултатът е, че шестнадесетичният низ от ObjectId се връща като низ.

Преобразуване двойно в цяло число

Когато преобразувате двойно в цяло число, се връща съкратената стойност.

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

Резултат:

{ "резултат" :123 }

Съкратената двойна стойност трябва да попада в рамките на минималната и максималната стойност за цяло число. Ако това не се случи, ще възникне грешка.

Освен това не можете да конвертирате двойна стойност, чиято съкратена стойност е по-малка от минималната стойност на цяло число или е по-голяма от максималната целочислена стойност.

Преобразуване на низ в цяло число

Когато конвертирате низ в цяло число, $convert връща числовата стойност на низа като цяло число.

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

Резултат:

{ "резултат" :123 }

Стойността на низа трябва да е базова10 цяло число (напр. "-123" , "123" ) и попадат в рамките на минималната и максималната стойност за цяло число.

Преобразуване на булева в цяло число

Когато конвертирате булева стойност в цяло число, $convert връща 1 за булева стойност true и 0 за булева стойност false .

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

Резултат:

{ "резултат" :1 }

Преобразуване на дата в низ

Можете да използвате $convert за да върнете дата като низ.

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

Резултат:

{ "резултат" :"2020-12-31T23:30:15.123Z" }

Обектът Date е преобразуван в низ.

Преобразуване двойно в дата

Следните типове могат да бъдат преобразувани в дата:

  • двойно
  • десетичен знак
  • дълго
  • низ
  • ObjectId

Ето пример за преобразуване на двойна в дата:

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

Резултат:

{ "резултат" :ISODate("1970-01-01T00:00:00.123Z") } 

Когато преобразувате числа в дата, числото представлява броя милисекунди от 1 януари 1970 г.

В нашия пример предоставихме двойна стойност от 123 , което се интерпретира като 123 милисекунди от 1 януари 1970 г.

Преобразуване на цяло число в десетично число

Ето пример за преобразуване на цяло число в десетично число:

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

Резултат:

{ "резултат" :NumberDecimal("123.000000000000") } 

Преобразуване на низ в дата

Ето пример за преобразуване на низ за дата/час в обект Date:

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

Резултат:

{ "резултат" :ISODate("2021-02-15T06:53:55Z") } 

Когато конвертирате низ в обект Date, низът трябва да е валиден низ от дата, като например:

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

Преобразуване в булеви

Когато конвертирате стойност в булева, резултатът ще бъде true или false , в зависимост от въведената стойност.

Обикновено за числови стойности това ще върне false ако стойността е нула (0 ) и true за всяка друга стойност.

За стойностите на string, ObjectId и Date винаги ще връща true .

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

Резултат:

{ "резултат" :вярно }

onError Параметър

Можете да използвате onError параметър за връщане на определена стойност в случай, че възникне грешка.

Да предположим, че имаме колекция, наречена dogs със следния документ:

{ "_id" :1, "name" :"Wag", "born" :"Март 2020", "weight" :null }

По-долу е даден пример за опит за извършване на преобразуване, което е неуспешно поради грешка. В първия пример не го правим използвайте onError .

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

Резултат:

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 

Това доведе до показване на неприятно съобщение за грешка.

Следващият пример показва как можем да направим това по-хубаво, като използваме onError параметър.

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

Резултат:

{ "резултат" :"Възникна грешка" }

Забележете, че все още получаваме връщането на документа и нашето персонализирано съобщение за грешка се показва в полето.

onNull Параметър

По избор можете да използвате onNull параметър, за да укажете какво да върнете, ако входната стойност е нула или липсва.

Използвайки предишния документ, можем да тестваме onNull параметър като този:

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

Резултат:

{ "резултат" :"Въведеното е нулево или празно" }


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Актуализирайте колекцията MongoDB с помощта на $toLower

  2. Redis срещу MongoDB

  3. Набор от реплики на MongoDB с проста идентификация с парола

  4. Как да анализирате използването на диск от Docker контейнер

  5. Приложение Meteor — нулиране на базата данни на разгърнато приложение