ปัญหาที่พบบ่อย: ฟิลด์เก็บตัวเลขเป็น String (เช่น "-0.45") ตอน $group แปลงเป็น float ได้ 0 วิธีแก้คือใช้ parseFloat() ในการอัปเดตข้อมูลก่อน
> db.demo523.insertOne({"details": {values: "-0.45"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e89b7efb3fbf26334ef611f") }
แสดงข้อมูล (values เป็น String):
> db.demo523.find();
{ "_id" : ObjectId("5e89b7efb3fbf26334ef611f"), "details" : { "values" : "-0.45" } }
คิวรีแปลง String เป็น Float จริง
> db.getCollection('demo523').find({}).forEach(function(d) {
... d.details.values = parseFloat(d.details.values);
... db.getCollection('demo523').save(d);
... });
ตรวจสอบหลังแปลง:
> db.demo523.find();
วิธีอื่นใน Aggregation (ไม่ต้องอัปเดตข้อมูล)
ใช้
$toDouble(MongoDB 4.0+) หรือ$convertใน pipeline:db.demo523.aggregate([ {$project: { floatValue: {$toDouble: "$details.values"} }} ]);สรุป
- Root cause: ข้อมูลเก็บเป็น String ไม่ใช่ Number
- แก้ถาวร: ใช้ parseFloat() อัปเดตข้อมูล (เหมาะสำหรับ one-time migration)
- แก้ในคิวรี: ใช้ $toDouble / $convert ใน aggregation (เหมาะสำหรับ ad-hoc query)
- ป้องกัน: Validate ข้อมูลตอน insert ให้เป็น Number ตั้งแต่แรก