2012-07-01 37 views
5

Chúng tôi có một ứng dụng lưu trữ một số giá trị cấu hình từ C/C++ trong MongoDB và có khả năng khởi động lại (tức là nó chạy trong một thời gian, ai đó ngắt ứng dụng, thay đổi cấu hình, sau đó chạy lại ứng dụng và chọn lại vị trí đã tắt). Điều này hoạt động như một sự quyến rũ cho các cấu hình boolean và chuỗi.Thay đổi kiểu của trường MongoDB thành số nguyên từ giao diện điều khiển

Nhưng sau đó chúng tôi có một số số nguyên (trong triển khai C/C++ hiện tại của chúng tôi - giá trị 32 bit). Và khi tôi sử dụng giao diện điều khiển MongoDB để sửa đổi các giá trị số nguyên đó, Mongo luôn lưu trữ chúng trở lại dưới dạng Số (tức là doulble trong triển khai C/C++). Chúng tôi sẽ thay đổi các ứng dụng để có giá trị gấp đôi, nơi nó mong đợi số nguyên nhưng tôi đã tự hỏi nếu có một cách để buộc Mongo để lưu trữ số nguyên từ giao diện điều khiển JavaScript của nó.

Mọi đề xuất?

+0

Lưu lại các giá trị bằng cách sử dụng parseFloat() hoặc không đặt bất kỳ dấu nói nào xung quanh giá trị – Sammaye

+1

Thực sự thử parseInt() xin lỗi – Sammaye

Trả lời

9

Trong ý nghĩa của C/C++ "của từ", ints là not actually guaranteed là các giá trị 32 bit. An int phải có ít nhất 16 bit, nhưng thường phù hợp với kiến ​​trúc nền tảng (ví dụ: 32 hoặc 64bit).

Như đã đề cập bởi @Jasd, JavaScript chỉ có một loại số là điểm nổi (double trong C).

Từ vỏ MongoDB, bạn sẽ có thể sử dụng các chức năng NumberInt(..) để nhận số BSON 32-bit integer value hoặc NumberLong(..) để nhận số nguyên BSON 64 bit.

+1

thú vị về kích thước int! –

+0

Lưu ý vấn đề https://jira.mongodb.org/browse/SERVER-5424 – nikow

0

Trình bao của MongoDB được cung cấp bởi một Công cụ JavaScript. Và JavaScript không có loại cho integer. Nó chỉ biết Number, là một loại cho số dấu phẩy động.
Bạn có thể thử sử dụng kiểu MongoDB NumberLong, nhưng nó không hoạt động đối với tôi khi tôi đã từng gặp vấn đề tương tự.

8

Bạn có thể sửa chữa các loại của tất cả các giá trị cho một lĩnh vực nhất định trên giao diện điều khiển với một cái gì đó như:

db.Statistic.find({kodoId: {$exists: true}}).forEach(function (x) { 
    x.kodoId = NumberInt(x.kodoId); 
    db.Statistic.save(x); 
}); 

này sẽ chỉ tài liệu tải có lĩnh vực kodoId và chuyển đổi chúng sang int và lưu lại. Bạn có thể làm một cái gì đó như:

db.Statistic.find({kodoId: {$exists: true}}, {kodoId: 1}).forEach(function (x) { 
    db.Statistic.update({ _id: x._id }, 
     {$set: { 
     kodoId: NumberInt(x.kodoId) 
     }}); 
}); 

với một param thứ hai mà sẽ chỉ tải giá trị kodoId (hy vọng từ một index). Điều này sẽ nhanh hơn rất nhiều vì nó không cần tải và lưu lại toàn bộ tài liệu - chỉ một trường đó.

+0

Bạn có thể thêm một 'try .. catch (err)' xung quanh ví dụ thứ 2 trong trường hợp có một số giá trị đã là NumberInt vì nó sẽ ném một lỗi. –

+0

Làm việc như một sự quyến rũ đối với tôi. Cảm ơn! –

Các vấn đề liên quan