ObjectId không chấp nhận chuỗi seed (seed string). Để dùng giá trị tùy chỉnh làm _id, gán trực tiếp giá trị string vào trường _id. Tạo collection:
> db.demo667.insertOne({_id:"Chris"});
{ "acknowledged" : true, "insertedId" : "Chris" }
> db.demo667.insertOne({_id:"David"});
{ "acknowledged" : true, "insertedId" : "David" }
> db.demo667.insertOne({_id:"Chris"});
2020-04-23T22:01:23.268+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: test.demo667 index: _id_ dup key: { : "Chris" }
...
> db.demo667.insertOne({_id:"Bob"});
{ "acknowledged" : true, "insertedId" : "Bob" }
> db.demo667.insertOne({_id:"Mike"});
{ "acknowledged" : true, "insertedId" : "Mike" }
Hiển thị dữ liệu (Chris chỉ xuất hiện 1 lần do unique _id):
> db.demo667.find();
Kết quả:
Giải thích:
- MongoDB cho phép _id là **bất kỳ kiểu BSON nào** (string, number, ObjectId, v.v.)
- ObjectId tự động sinh có 12 bytes: timestamp (4) + machine (3) + pid (2) + counter (3)
- Không thể "seed" ObjectId từ string - phải tự generate hoặc dùng driver support
Tạo ObjectId tùy ý (driver):
- Node.js:
new ObjectId("507f1f77bcf86cd799439011")(24 hex chars) - Python:
ObjectId("507f1f77bcf86cd799439011") - Java:
new ObjectId("507f1f77bcf86cd799439011")
Khuyến nghị: Để MongoDB tự sinh ObjectId (mặc định) để đảm bảo unique, sortable, distributed. Chỉ dùng custom _id khi có yêu cầu nghiệp vụ đặc biệt (UUID, slug, email...).