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ủatrue
và0
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"}