Ẩn _id (primary key) trong kết quả find() với projection
Trong MongoDB, _id luôn được trả về trừ khi tắt rõ ràng bằng projection { _id: 0 }.
1. Dữ liệu mẫu
> db.demo471.insertOne({ ClientId: 101, ClientName: "Chris" });
> db.demo471.insertOne({ ClientId: 102, ClientName: "Bob" });
> db.demo471.insertOne({ ClientId: 103, ClientName: "David" });
2. Tìm kiếm bình thường (có _id)
> db.demo471.find();
{ "_id": ObjectId("5e805711b0f3fa88e2279077"), "ClientId": 101, "ClientName": "Chris" }
{ "_id": ObjectId("5e80571db0f3fa88e2279078"), "ClientId": 102, "ClientName": "Bob" }
{ "_id": ObjectId("5e805724b0f3fa88e2279079"), "ClientId": 103, "ClientName": "David" }
3. Loại bỏ _id và ClientId, chỉ lấy ClientName
> db.demo471.find({}, { _id: 0, ClientId: 0 });
// Hoặc chỉ định field muốn lấy (include):
// db.demo471.find({}, { _id: 0, ClientName: 1 });
4. Kết quả
{ "ClientName": "Chris" }
{ "ClientName": "Bob" }
{ "ClientName": "David" }
Quy tắc Projection (Include/Exclude)
| Quy tắc | Ví dụ | Kết quả |
|---|---|---|
| Chỉ include (1) | { name: 1, age: 1 } | Chỉ name, age + _id (mặc định) |
| Chỉ exclude (0) | { _id: 0, password: 0 } | Tất cả TRỪ _id, password |
| KHÔNG trộn lẫn | { name: 1, age: 0 } | ❌ LỖI (trừ _id được phép mix) |
| _id đặc biệt | { _id: 0, name: 1 } | ✅ Hợp lệ: exclude _id + include name |
Lưu ý: "Xóa primary key" vs "Ẩn trong kết quả"
- Ẩn trong kết quả (Projection):
find({}, { _id: 0 })- Document trong DB vẫn có _id - Xóa thật sự _id: KHÔNG THỂ. _id là bắt buộc, immutable, unique. Không thể unset.
- Nếu muốn key tự nhiên: Dùng trường khác làm unique index, nhưng _id vẫn tồn tại
Ví dụ projection phức tạp
// Lấy tên, tuổi, ẩn _id
db.users.find({}, { _id: 0, name: 1, age: 1 });
// Lấy tất cả TRỪ password, secret, _id
db.users.find({}, { _id: 0, password: 0, secret: 0 });
// Slice mảng: lấy 5 phần tử đầu
db.posts.find({}, { _id: 0, comments: { $slice: 5 } });