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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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ụ.