MongoDBは整数を挿入しようとすると浮動小数点を挿入します


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

Mongoに整数を挿入するにはどうすればよいですか?

ありがとうございました


どのバージョンのmongodbを使用していますか?
kamaradclimber


1
私の場合、すでにLongとして設定されている「val」で{$ set:{val:NumberInt(0)}}にしたかったのですが、変更されませんでした。私はいくつかの他の値に最初の変更、それに持っていた、そして有効にする(0)NumberIntのために、0に戻し、それを変更する
kommradHomer

同じ問題があり、誤ってint32をdoubleに変更したことに気付いた後、最初に別の値に変更しない限り、NumberInt()を使用して設定し直してもタイプは修正されませんでした。
user1055568 16

回答:


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

NumberLongを使用することもできます。


1
しかし、findOneでは、NumberLong(0)は0ではない
空想家

11
デフォルトでは、mongoシェルはすべての数値を浮動小数点値として扱います。したがって、NumberIntやNumberLongなど、使用する数値のタイプを明示的に指定する必要があります。 docs.mongodb.org/manual/core/shell-types
Yadu

12
質問があります。NumberIntはmongoシェルでのみ提供されていますが、node.jsのようなJavaScript言語でそれを行うにはどうしますか?
萧易客

@Shawyeokはここに回答ですstackoverflow.com/a/21870772/3815843
GRiMe2D

intには限界があることを考慮することが重要です。数値が大きい場合は、NumberLongの使用を検討してください
Tim Givois

17

少し簡単な構文(少なくともRobomongoで)が私にとってうまくいきました:

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

5

値の型が既にdoubleの場合、$ setコマンドで値を更新すると、NumberInt()関数またはNumberLong()関数を使用するときに値の型doubleをintに変更できません。したがって、値のタイプを変更するには、レコード全体を更新する必要があります。

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

$set少なくともMongo 4.2では機能したので、これはおそらくバグでした。
サーベラス

-10

まあ、それはJavaScriptなので、「値」にあるのは数値であり、整数または浮動小数点数にすることができます。しかし、JavaScriptには実際には違いはありません。JavaScriptの学習から:

数値データ型

JavaScriptの数値データ型は浮動小数点数ですが、小数部がある場合とない場合があります。それらは小数点または小数成分を持っていない場合、それらは整数塩基10 -2の範囲の整数として扱われている53 2へ53


27
実際にはそうではありません。JSは違いを認識しませんが、別の言語(javaなど)からmongoに接続するとすぐに、違いを感じます。
Omri Spector

2
アプリケーションがさまざまな点で壊れたのは、1つの理由だけです。intが保存され、floatとして返されます。原因は、javascriptを使用するmongoシェルを介して手動で挿入したことが原因であると思われます。
Melsi 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.