MongoDB แทรกลอยเมื่อพยายามที่จะแทรกจำนวนเต็ม


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

ฉันจะให้ Mongo แทรกจำนวนเต็มได้อย่างไร

ขอบคุณ


mongodb รุ่นใดที่คุณใช้?
kamaradclimber


1
โปรดทราบว่าในกรณีของฉันเมื่อฉันต้องการ {$ set: {val: NumberInt (0)}} ที่ "val" บางตัวที่ตั้งค่าไว้เป็น Long แล้วมันไม่ได้เปลี่ยนเลย ฉันต้องเปลี่ยนเป็นค่าอื่นก่อนแล้วเปลี่ยนกลับเป็น 0 เพื่อให้ NumberInt (0) มีผล
kommradHomer

ฉันมีปัญหาเดียวกันหลังจากตระหนักว่าฉันได้เปลี่ยน int32 เป็นสองเท่าโดยไม่ตั้งใจการตั้งค่ากลับมาโดยใช้ NumberInt () ไม่ได้แก้ไขประเภทยกเว้นว่าฉันเปลี่ยนเป็นค่าอื่นเป็นครั้งแรก
user1055568

คำตอบ:


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

คุณยังสามารถใช้ NumberLong


1
แต่ใน findOne บอกว่า NumberLong (0) ไม่ใช่ 0
daydreamer

11
โดยค่าเริ่มต้นเปลือก mongo ถือว่าตัวเลขทั้งหมดเป็นค่าจุดลอย ดังนั้นเราต้องระบุประเภทของหมายเลขที่เราต้องการใช้อย่างเช่น NumberInt หรือ NumberLong docs.mongodb.org/manual/core/shell-types
Yadu

12
ฉันมีคำถาม. NumberInt มีให้ในเชลล์ mongo เท่านั้นคุณจะทำเช่นนั้นในภาษา JavaScript เช่น node.js ได้อย่างไร
萧易客

@Shawyeok นี่คือคำตอบstackoverflow.com/a/21870772/3815843
GRiMe2D

มันเป็นสิ่งสำคัญที่จะต้องคำนึงถึงว่า ints มีขอบเขต หากตัวเลขมีขนาดใหญ่ลองใช้ NumberLong
Tim Givois

17

ไวยากรณ์ที่เรียบง่ายกว่าเล็กน้อย (อย่างน้อยใน Robomongo) เหมาะกับฉัน:

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

5

หากชนิดของค่าเป็นสองเท่าแล้วให้อัพเดตค่าด้วยคำสั่ง $ set ไม่สามารถเปลี่ยนประเภทของค่าเป็น double เมื่อใช้ฟังก์ชัน NumberInt () หรือ NumberLong () ดังนั้นในการเปลี่ยนประเภทของค่ามันจะต้องปรับปรุงบันทึกทั้งหมด

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

$setทำงานอย่างน้อยใน Mongo 4.2 ดังนั้นบางทีนี่อาจเป็นข้อผิดพลาด
Cerberus

-10

มันคือจาวาสคริปต์ดังนั้นสิ่งที่คุณมีใน 'ค่า' คือตัวเลขซึ่งอาจเป็นจำนวนเต็มหรือทศนิยม แต่ JavaScript มีความแตกต่างไม่มาก จากการเรียนรู้ JavaScript :

ชนิดข้อมูลตัวเลข

ชนิดข้อมูลตัวเลขใน JavaScript เป็นตัวเลขทศนิยม แต่อาจมีหรือไม่มีส่วนประกอบ หากพวกเขาไม่ได้มีจุดทศนิยมหรือส่วนประกอบเศษส่วนที่พวกเขากำลังได้รับการรักษาเป็น-10 เลขฐานตัวเลขทั้งหมดในช่วงของ -2 53ที่จะ 2 53


27
จริงๆแล้วไม่เป็นความจริง ในขณะที่ JS ไม่เห็นความแตกต่างทันทีที่คุณเชื่อมต่อกับ mongo จากภาษาอื่น (เช่น java) คุณจะรู้สึกถึงความแตกต่างอย่างมาก
Omri Spector

2
แอปพลิเคชันของฉันมีจุดแตกต่างกันเพียงหนึ่งเหตุผล int ถูกบันทึกและส่งคืนเป็นแบบลอย ฉันสงสัยว่าสาเหตุต้องมีการแทรกด้วยตนเองที่ฉันทำผ่าน mongo shell ซึ่งใช้จาวาสคริปต์
Melsi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.