Để chuyển ObjectId thành chuỗi String trong MongoDB, sử dụng toán tử $toString trong Aggregation Pipeline (từ phiên bản 4.0+).
Ví dụ minh họa
Tạo collection objectidToStringDemo:
> db.objectidToStringDemo.insertOne({ "UserName": "John" });
> db.objectidToStringDemo.insertOne({ "UserName": "Chris" });
> db.objectidToStringDemo.insertOne({ "UserName": "Larry" });
> db.objectidToStringDemo.insertOne({ "UserName": "Robert" });
Hiển thị dữ liệu gốc (ObjectId):
> db.objectidToStringDemo.find().pretty();
Kết quả:
{ "_id" : ObjectId("5c92b80036de59bd9de0639d"), "UserName" : "John" }
{ "_id" : ObjectId("5c92b80436de59bd9de0639e"), "UserName" : "Chris" }
{ "_id" : ObjectId("5c92b80936de59bd9de0639f"), "UserName" : "Larry" }
{ "_id" : ObjectId("5c92b81836de59bd9de063a0"), "UserName" : "Robert" }
Aggregation chuyển _id thành String
> db.objectidToStringDemo.aggregate([
{ $project: { _id: { $toString: "$_id" } } }
]);
Kết quả:
{ "_id" : "5c92b80036de59bd9de0639d" }
{ "_id" : "5c92b80436de59bd9de0639e" }
{ "_id" : "5c92b80936de59bd9de0639f" }
{ "_id" : "5c92b81836de59bd9de063a0" }
Giữ lại các field khác, chỉ chuyển _id
db.objectidToStringDemo.aggregate([
{ $project: {
_id: { $toString: "$_id" },
UserName: 1
} }
]);
Kết quả:
{ "_id" : "5c92b80036de59bd9de0639d", "UserName" : "John" }
{ "_id" : "5c92b80436de59bd9de0639e", "UserName" : "Chris" }
{ "_id" : "5c92b80936de59bd9de0639f", "UserName" : "Larry" }
{ "_id" : "5c92b81836de59bd9de063a0", "UserName" : "Robert" }
Ứng dụng thực tế
- Trả về API JSON cho frontend (JavaScript xử lý string dễ hơn ObjectId).
- Join (lookup) với collection khác mà khóa là string.
- In log, debug, export CSV/Excel.
Trong Driver (Node.js, Python...)
- Node.js:
doc._id.toString()hoặcdoc._id.toHexString() - Python (PyMongo):
str(doc['_id']) - Mongoose: Tự động serialize thành string khi
toJSON()hoặctoObject().
Lưu ý: $toString chỉ dùng trong aggregation. Trong find() thông thường, _id luôn là ObjectId.