MongoDB chèn float khi cố gắng chèn số nguyên


209
   > db.data.update({'name': 'zero'}, {'$set': {'value': 0}}) 
   > db.data.findOne({'name': 'zero})
    {'name': 'zero', 'value': 0.0}  

Làm cách nào để có được Mongo để chèn một số nguyên?

Cảm ơn bạn


bạn sử dụng phiên bản nào của mongodb?
kamaradclimber


1
lưu ý rằng trong trường hợp của tôi, khi tôi muốn {$ set: {val: NumberInt (0)}} tại một số "val" đã được đặt là Long, nó đã không thay đổi nó. Trước tiên tôi phải thay đổi nó thành một số giá trị khác, sau đó đổi lại thành 0, để NumberInt (0) có hiệu lực
kommradHomer

Tôi gặp vấn đề tương tự, sau khi nhận ra tôi đã thay đổi nhầm int32 thành gấp đôi, đặt lại bằng NumberInt () đã không sửa loại trừ khi lần đầu tiên tôi đổi thành giá trị khác.
dùng1055568

Câu trả lời:


328
db.data.update({'name': 'zero'}, {'$set': {'value': NumberInt(0)}})

Bạn cũng có thể sử dụng NumberLong.


1
nhưng trong findOne, nó nói NumberLong (0) không phải là 0
mơ mộng

11
Theo mặc định, vỏ mongo coi tất cả các số là giá trị dấu phẩy động. Vì vậy, chúng ta cần xác định rõ loại số nào chúng ta muốn sử dụng, ví dụ NumberInt hoặc NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu

12
Tôi có một câu hỏi. NumberInt chỉ được cung cấp trong vỏ mongo, làm thế nào để bạn làm điều đó bằng ngôn ngữ JavaScript như node.js?
萧 易

@Shawyeok đây là câu trả lời stackoverflow.com/a/21870772/3815843
GRiMe2D

Điều quan trọng là phải tính đến việc ints có giới hạn. Nếu số lượng lớn, hãy cân nhắc sử dụng NumberLong
Tim Givois

17

Một cú pháp đơn giản hơn một chút (ít nhất là trong Robomongo) đã làm việc với tôi:

db.database.save({ Year : NumberInt(2015) });

5

Nếu loại giá trị đã tăng gấp đôi, thì cập nhật giá trị bằng lệnh $ set không thể thay đổi loại giá trị gấp đôi thành int khi sử dụng hàm NumberInt () hoặc NumberLong (). Vì vậy, để Thay đổi loại giá trị, nó phải cập nhật toàn bộ hồ sơ.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)

$setđã làm việc ít nhất trong Mongo 4.2, vì vậy có lẽ đây là một lỗi.
Cerberus

-10

Chà, đó là JavaScript, vì vậy những gì bạn có trong 'value' là một Số, có thể là số nguyên hoặc số float. Nhưng thực sự không có sự khác biệt trong JavaScript. Từ việc học JavaScript :

Kiểu dữ liệu số

Các kiểu dữ liệu số trong JavaScript là các số dấu phẩy động, nhưng chúng có thể có hoặc không có thành phần phân số. Nếu họ không có một dấu thập phân hoặc một thành phần phân đoạn, họ đang đối xử như số nguyên-base-10 số nguyên trong một loạt các -2 53 để 2 53 .


27
Trên thực tế đó là không đúng sự thật. Mặc dù JS không thấy sự khác biệt, ngay khi bạn kết nối với mongo từ một ngôn ngữ khác (ví dụ java), bạn sẽ cảm nhận được rất nhiều sự khác biệt.
Omri Spector

2
Ứng dụng của tôi đã bị hỏng ở các điểm khác nhau chỉ vì một lý do, int được lưu và trả về dưới dạng float. Tôi nghi ngờ nguyên nhân phải là một số chèn thủ công tôi đã thực hiện thông qua shell mongo sử dụng javascript.
Melsi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.