Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

แก้ไขปัญหา $group คืนค่า 0 ในการแปลง Float ใน MongoDB

ปัญหาที่พบบ่อย: ฟิลด์เก็บตัวเลขเป็น 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 ตั้งแต่แรก