Lọc document theo kiểu dữ liệu BSON với $type
Toán tử $type cho phép truy vấn document dựa trên kiểu dữ liệu BSON của trường (string, int, double, array, object...).
1. Dữ liệu: Age混合 kiểu int và string
> db.demo470.insertOne({ Age: 23 });
> db.demo470.insertOne({ Age: "Unknown" });
> db.demo470.insertOne({ Age: 24 });
> db.demo470.insertOne({ Age: "Not provided" });
2. Chỉ lấy Age là số (int/double)
> db.demo470.find({ 'Age': { $type: "number" } });
3. Kết quả
{ "_id": ObjectId("5e805456b0f3fa88e2279070"), "Age": 23 }
{ "_id": ObjectId("5e805461b0f3fa88e2279072"), "Age": 24 }
Các alias kiểu dữ liệu phổ biến
| Alias | BSON Type | Số hiệu | Ví dụ |
|---|---|---|---|
| "double" | Double | 1 | 3.14 |
| "string" | String | 2 | "hello" |
| "object" | Object | 3 | { a: 1 } |
| "array" | Array | 4 | [1, 2, 3] |
| "binData" | Binary | 5 | BinData(0, "...") |
| "objectId" | ObjectId | 7 | ObjectId("...") |
| "bool" | Boolean | 8 | true/false |
| "date" | Date | 9 | ISODate("...") |
| "null" | Null | 10 | null |
| "regex" | Regex | 11 | /pattern/ |
| "int" | 32-bit Integer | 16 | NumberInt(42) |
| "long" | 64-bit Integer | 18 | NumberLong(42) |
| "number" | Double, Int, Long | - | 1, 1.5, NumberLong(1) |
Ví dụ nâng cao
// Chỉ lấy Age là Int32 (không phải Double, Long)
db.demo470.find({ Age: { $type: "int" } });
// Lấy Age KHÔNG phải string (số hoặc null)
db.demo470.find({ Age: { $not: { $type: "string" } } });
// Kết hợp nhiều kiểu
db.demo470.find({ Age: { $type: ["int", "long", "double"] } });
Ứng dụng thực tế
- Dọn dẹp dữ liệu bẩn (dirty data) - tìm field sai kiểu
- Migration dữ liệu - xác định record cần convert
- Validation schema-less collection