Sự khác biệt chính
NumberLong(x) (không dấu ngoặc kép) coi tham số là số JavaScript 64-bit, dẫn đến làm tròn khi vượt quá giới hạn an toàn của số nguyên (Number.MAX_SAFE_INTEGER = 9,007,199,254,740,991).
NumberLong("x") (có dấu ngoặc kép) coi tham số là chuỗi, bảo toàn độ chính xác của số nguyên 64-bit lớn.
Ví dụ minh họa
> db.demo603.insert({ "longValue": NumberLong(988998985857575789) });
WriteResult({ "nInserted": 1 })
> db.demo603.insert({ "longValueInString": NumberLong("988998985857575789") });
WriteResult({ "nInserted": 1 })
Kết quả truy vấn
> db.demo603.find().pretty();
Kết quả:
{
"_id": ObjectId("5e9605e5ed011c280a0905d1"),
"longValue": NumberLong("988998985857575808") // Đã bị làm tròn
}
{
"_id": ObjectId("5e9605faed011c280a0905d2"),
"longValueInString": NumberLong("988998985857575789") // Giữ nguyên giá trị
}
Kết luận: Luôn sử dụng NumberLong("giá_trị") với chuỗi khi làm việc với số nguyên lớn (> 2^53) để tránh mất độ chính xác.