MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB $ chuyển đổi

Trong MongoDB, bạn có thể sử dụng $convert toán tử đường ống tổng hợp để chuyển đổi một giá trị thành một loại được chỉ định.

Bạn có thể chuyển đổi bất kỳ biểu thức hợp lệ nào thành kép, chuỗi, ObjectId, boolean, Ngày, số nguyên, dài hoặc thập phân.

Không phải tất cả các loại đều có thể được chuyển đổi sang bất kỳ loại nào khác. Một số loại chỉ có thể được chuyển đổi từ một tập hợp con của các loại MongoDB có sẵn. Ví dụ:bạn không thể chuyển đổi ngày thành số nguyên.

Bạn có thể tùy ý sử dụng onError để chỉ định những gì sẽ trả về trong trường hợp có lỗi. Bạn có thể tùy ý sử dụng onNull để chỉ định những gì sẽ trả về nếu giá trị đầu vào là trống hoặc bị thiếu.

Dữ liệu mẫu

Giả sử chúng ta có một bộ sưu tập được gọi là samples với tài liệu sau:

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

Các ví dụ sau minh họa cách chuyển đổi từng trường thành các kiểu khác.

Chuyển đổi ObjectId thành Chuỗi

_id trường trong tài liệu trên là một ObjectId. Dưới đây là một ví dụ về việc chuyển đổi ObjectId thành một chuỗi.

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

Kết quả:

 {"_id":ObjectId ("6011e471c8eb4369cf6ad9d5"), "kết quả":"6011e471c8eb4369cf6ad9d5"} 

Kết quả là chuỗi thập lục phân từ ObjectId được trả về dưới dạng một chuỗi.

Chuyển Double sang Integer

Khi bạn chuyển đổi một số kép thành một số nguyên, giá trị bị cắt ngắn sẽ được trả về.

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

Kết quả:

 {"kết quả":123} 

Giá trị kép bị cắt ngắn phải nằm trong giá trị nhỏ nhất và lớn nhất của một số nguyên. Nếu nó không xảy ra lỗi.

Ngoài ra, bạn không thể chuyển đổi một giá trị kép có giá trị bị cắt ngắn nhỏ hơn giá trị số nguyên tối thiểu hoặc lớn hơn giá trị số nguyên tối đa.

Chuyển đổi chuỗi thành số nguyên

Khi bạn chuyển đổi một chuỗi thành một số nguyên, $convert trả về giá trị số của chuỗi dưới dạng số nguyên.

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

Kết quả:

 {"kết quả":123} 

Giá trị chuỗi phải là cơ số 10 số nguyên (ví dụ:"-123" , "123" ) và nằm trong giá trị nhỏ nhất và lớn nhất của một số nguyên.

Chuyển Boolean sang Integer

Khi bạn chuyển đổi boolean thành số nguyên, $convert trả về 1 cho giá trị boolean của true0 cho giá trị boolean là false .

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

Kết quả:

 {"kết quả":1} 

Chuyển đổi ngày thành chuỗi

Bạn có thể sử dụng $convert để trả về ngày tháng dưới dạng một chuỗi.

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

Kết quả:

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

Đối tượng Ngày đã được chuyển đổi thành một chuỗi.

Chuyển đổi Double thành Date

Các loại sau có thể được chuyển đổi thành ngày:

  • nhân đôi
  • thập phân
  • dài
  • chuỗi
  • ObjectId

Dưới đây là một ví dụ về việc chuyển đổi một ngày đôi thành một ngày:

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

Kết quả:

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

Khi bạn chuyển đổi số thành ngày, số đó đại diện cho số mili giây kể từ ngày 1 tháng 1 năm 1970.

Trong ví dụ của chúng tôi, chúng tôi đã cung cấp một giá trị kép của 123 , được hiểu là 123 mili giây kể từ ngày 1 tháng 1 năm 1970.

Chuyển đổi số nguyên thành số thập phân

Dưới đây là một ví dụ về chuyển đổi một số nguyên thành số thập phân:

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

Kết quả:

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

Chuyển đổi chuỗi thành ngày

Dưới đây là một ví dụ về chuyển đổi chuỗi ngày / giờ thành đối tượng Ngày:

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

Kết quả:

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

Khi bạn chuyển đổi một chuỗi thành một đối tượng Ngày, chuỗi đó phải là một chuỗi ngày hợp lệ, chẳng hạn như:

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

Chuyển đổi sang Boolean

Khi bạn chuyển đổi một giá trị thành boolean, kết quả sẽ là true hoặc false , tùy thuộc vào giá trị đầu vào.

Nói chung, đối với các giá trị số, giá trị này sẽ trả về false nếu giá trị bằng 0 (0 ) và true cho bất kỳ giá trị nào khác.

Đối với các giá trị chuỗi, ObjectId và Date, nó sẽ luôn trả về true .

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

Kết quả:

 {"kết quả":true} 

onError Tham số

Bạn có thể sử dụng onError để trả về một giá trị được chỉ định trong trường hợp xảy ra lỗi.

Giả sử chúng ta có một bộ sưu tập có tên là dogs với tài liệu sau:

 {"_id":1, "name":"Wag", "sinh":"tháng 3 năm 2020", "trọng lượng":null} 

Dưới đây là ví dụ về việc cố gắng thực hiện chuyển đổi không thành công do lỗi. Trong ví dụ đầu tiên, chúng tôi không sử dụng onError .

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

Kết quả:

 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 

Điều đó dẫn đến một thông báo lỗi khó chịu được hiển thị.

Ví dụ sau cho thấy cách chúng ta có thể làm cho điều này đẹp hơn bằng cách sử dụng onError tham số.

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

Kết quả:

 {"result":"Đã xảy ra lỗi"} 

Lưu ý rằng chúng tôi vẫn nhận được tài liệu được trả lại và thông báo lỗi tùy chỉnh của chúng tôi được hiển thị trong trường.

onNull Tham số

Bạn có thể tùy ý sử dụng onNull để chỉ định những gì sẽ trả về nếu giá trị đầu vào là trống hoặc bị thiếu.

Sử dụng tài liệu trước đó, chúng tôi có thể kiểm tra onNull tham số như thế này:

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

Kết quả:

 {"result":"Đầu vào là null hoặc rỗng"} 


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để trả lại định dạng ngày ISO trong PHP cho MongoDB?

  2. Sọc:Phải cung cấp nguồn hoặc khách hàng

  3. Redis nhanh hơn mongoDB bao nhiêu?

  4. Không thể kết nối với mongodb errno:61 Kết nối bị từ chối

  5. (node:3341) Deprecation Cảnh báo:Mongoose:mpromise