Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tại sao MongoDB group query trả về 0 khi chuyển float? Cách sửa

Khi chuyển đổi chuỗi sang float trong MongoDB, dùng parseFloat() thay vì ép kiểu trực tiếp. Tạo collection với giá trị chuỗi:

> db.demo523.insertOne({"details":{"values":"-0.45"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e89b7efb3fbf26334ef611f") }

Hiển thị dữ liệu (values là string "-0.45"):

> db.demo523.find();

Kết quả:

Sử dụng forEach duyệt cursor, parseFloat() chuyển đổi, save() ghi đè tài liệu:

> db.getCollection('demo523').find({}).forEach( function(d) {
  d.details.values = parseFloat( d.details.values );
  db.getCollection('demo523').save(d);
} );

Kiểm tra lại - values giờ là number -0.45:

> db.demo523.find();

Kết quả:

Giải thích: MongoDB shell là JavaScript engine, parseFloat() chuyển chuỗi thành số IEEE 754. Nếu dùng Number() hoặc +value cũng được nhưng parseFloat an toàn hơn với chuỗi không hợp lệ (trả về NaN).

Cách tốt hơn (MongoDB 4.0+): Dùng aggregation $toDouble hoặc $convert để chuyển đổi trong query mà không sửa dữ liệu gốc:

db.demo523.aggregate([{ $project: { "details.values": { $toDouble: "$details.values" } } }])

Lưu ý: db.eval() và forEach() + save() đã deprecated, không dùng cho production.