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


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.


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) });

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)

$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 .


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.