Tìm document theo giá trị số nguyên chính xác với find()
Sử dụng find() với filter trường số. MongoDB so sánh kiểu dữ liệu chặt chẽ: 101 (int) ≠ "101" (string).
1. Dữ liệu: Project_Id kiểu int (có cả âm)
> db.demo472.insertOne({ Project_Id: -101, ProjectName: "Online Customer Tracking" });
> db.demo472.insertOne({ Project_Id: 101, ProjectName: "Online Banking System" });
> db.demo472.insertOne({ Project_Id: 102, ProjectName: "Online Library System" });
2. Tìm Project_Id = -101
> db.getCollection('demo472').find({ "Project_Id": -101 });
3. Kết quả
{
"_id": ObjectId("5e80586cb0f3fa88e227907a"),
"Project_Id": -101,
"ProjectName": "Online Customer Tracking"
}
Lưu ý về so sánh kiểu số trong MongoDB
| Giá trị query | Khớp với | Không khớp |
|---|---|---|
| 101 (int) | Int32(101), Int64(101), Double(101.0) | "101" (string) |
| NumberInt(101) | Int32(101) | Int64(101), Double(101.0) |
| NumberLong(101) | Int64(101) | Int32(101), Double(101.0) |
| 101.0 (double) | Double(101.0), Int32(101), Int64(101) | "101" (string) |
Quan trọng: MongoDB cho phép so sánh cross-type giữa các kiểu số (int, long, double) nhưng KHÔNG so sánh số với string.
Tìm nhiều giá trị số ($in)
db.demo472.find({ Project_Id: { $in: [-101, 101] } });
// Trả về cả 2 document Project_Id -101 và 101
Tìm khoảng số ($gte, $lte)
// Project_Id từ 100 đến 105
db.demo472.find({ Project_Id: { $gte: 100, $lte: 105 } });
// Project_Id âm
db.demo472.find({ Project_Id: { $lt: 0 } });
Kiểm tra kiểu dữ liệu trường
// Xem kiểu BSON của Project_Id
db.demo472.aggregate([
{ $project: { Project_Id: 1, type: { $type: "$Project_Id" } } }
]);
// { "Project_Id": -101, "type": "int" }
Best practice
- Validate ở application layer trước khi insert
- Dùng
$typetrong migration để phát hiện field sai kiểu