Từ MongoDB 4.0, bạn có thể sử dụng $toObjectId
toán tử đường ống tổng hợp để chuyển đổi một chuỗi thành ObjectId.
Chuỗi phải là một chuỗi thập lục phân có độ dài 24.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là foo
và nó chứa tài liệu sau:
{ "_id" : 1, "bar" : "6008c9a5c8eb4369cf6ad9cc" }
Chúng ta có thể sử dụng $toObjectId
toán tử để chuyển đổi bar
trường tới một ObjectId.
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$bar" }
}
}
]
).pretty()
Kết quả:
{ "bar" : ObjectId("6008c9a5c8eb4369cf6ad9cc") }
Bây giờ chuỗi đã được chuyển đổi thành ObjectId như được chỉ định.
Lỗi
Ví dụ trên hoạt động vì chúng tôi đã cung cấp một chuỗi thập lục phân có độ dài 24 cho $toObjectId
nhà điều hành.
Đây là điều sẽ xảy ra khi chúng tôi cung cấp giá trị không phải là chuỗi thập lục phân có độ dài 24:
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$_id" }
}
}
]
).pretty()
Kết quả:
Error: command failed: {
"ok" : 0,
"errmsg" : "Unsupported conversion from double to objectId in $convert with no onError value",
"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
Lỗi này tạm dừng toàn bộ hoạt động tổng hợp và tạo ra một lỗi trông khó chịu.
Một phương pháp thay thế là sử dụng $convert
toán tử thay vì $toObjectId
. $convert
cho phép bạn xử lý các lỗi mà không ảnh hưởng đến toàn bộ hoạt động tổng hợp.
$toObjectId
toán tử tương đương với việc sử dụng $convert
toán tử để chuyển đổi giá trị thành ObjectId.
Dưới đây là ví dụ tương tự bằng cách sử dụng $convert
:
db.foo.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$_id",
to: "objectId",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Kết quả:
{ "result" : "An error occurred" }
Sử dụng $convert
cho phép chúng tôi chỉ định thông báo lỗi để sử dụng khi lỗi xảy ra và nó không làm tạm dừng toàn bộ hoạt động tổng hợp.
Xem MongoDB $convert
để biết thêm ví dụ.