Sisipan MongoDB mengambang ketika mencoba memasukkan bilangan bulat

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

Bagaimana cara saya mendapatkan Mongo untuk memasukkan bilangan bulat?

Terima kasih

pelamun
sumber
mongodb versi apa yang Anda gunakan?
kamaradclimber
1
perhatikan bahwa dalam kasus saya, ketika saya ingin {$ set: {val: NumberInt (0)}} di beberapa "val" yang sudah ditetapkan sebagai Long, itu tidak mengubahnya. Saya pertama-tama harus mengubahnya ke beberapa nilai lain, kemudian mengubahnya kembali ke 0, agar NumberInt (0) berlaku
kommradHomer
Saya memiliki masalah yang sama, setelah menyadari bahwa saya telah keliru mengubah int32 menjadi dua kali lipat, mengaturnya kembali menggunakan NumberInt () tidak memperbaiki tipe kecuali saya pertama kali berubah ke nilai yang berbeda.
user1055568

Jawaban:

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

Anda juga bisa menggunakan NumberLong.

Bernie Hackett
sumber
1
tetapi dalam findOne dikatakan NumberLong (0) bukan sebagai 0
daydreamer
11
Secara default, shell mongo memperlakukan semua angka sebagai nilai floating-point. Jadi kita perlu secara eksplisit menentukan jenis nomor apa yang ingin kita gunakan misalnya NumberInt atau NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu
12
Saya punya pertanyaan. NumberInt hanya disediakan di mongo shell, bagaimana Anda melakukannya dalam bahasa JavaScript seperti node.js?
萧 易 客
@Shawyeok di sini adalah jawaban stackoverflow.com/a/21870772/3815843
GRiMe2D
Penting untuk mempertimbangkan bahwa para int memiliki batasan. Jika angkanya besar, pertimbangkan untuk menggunakan NumberLong
Tim Givois
17

Sintaks yang sedikit lebih sederhana (setidaknya di Robomongo) bekerja untuk saya:

db.database.save({ Year : NumberInt(2015) });
Grid Trekkor
sumber
5

Jika tipe nilai sudah dobel, maka perbarui nilainya dengan perintah $ set tidak bisa mengubah tipe nilai dobel menjadi int saat menggunakan fungsi NumberInt () atau NumberLong (). Jadi, untuk Mengubah jenis nilai, itu harus memperbarui seluruh catatan.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)
Ethan. Zhang
sumber
$setbekerja setidaknya di Mongo 4.2, jadi mungkin ini adalah bug.
Cerberus
-10

Yah, itu JavaScript, jadi yang Anda miliki dalam 'nilai' adalah Angka, yang bisa berupa bilangan bulat atau pelampung. Tapi sebenarnya tidak ada perbedaan dalam JavaScript. Dari Belajar JavaScript :

Tipe Data Angka

Tipe data angka dalam JavaScript adalah angka floating-point, tetapi mereka mungkin atau mungkin tidak memiliki komponen fraksional. Jika mereka tidak memiliki titik desimal atau komponen fraksional, mereka diperlakukan sebagai bilangan bulat — bilangan bulat basis-10 dalam kisaran –2 53 hingga 2 53 .

Christian Horsdal
sumber
27
Sebenarnya itu tidak benar. Meskipun JS tidak melihat perbedaan, segera setelah Anda terhubung ke mongo dari bahasa lain (misalnya java), Anda akan sangat merasakan perbedaannya.
Omri Spector
2
Aplikasi saya telah rusak di berbagai titik hanya karena satu alasan, int disimpan dan dikembalikan sebagai float. Saya menduga penyebabnya pasti karena beberapa penyisipan manual yang saya lakukan melalui mongo shell yang menggunakan javascript.
Melsi