MongoDB insère float lors de la tentative d'insertion d'un entier

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

Comment puis-je faire en sorte que Mongo insère un entier?

Je vous remercie

rêveur
la source
quelle version de mongodb utilisez-vous?
kamaradclimber
1
notez que dans mon cas, quand je voulais {$ set: {val: NumberInt (0)}} à un "val" qui est déjà défini comme Long, cela ne l'a pas changé. J'ai d'abord dû la changer en une autre valeur, puis la remettre à 0, pour que NumberInt (0) prenne effet
kommradHomer
J'ai eu le même problème, après avoir réalisé que j'avais par erreur changé un int32 en double, le redéfinir en utilisant NumberInt () n'a pas corrigé le type sauf si j'ai d'abord changé pour une valeur différente.
user1055568

Réponses:

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

Vous pouvez également utiliser NumberLong.

Bernie Hackett
la source
1
mais dans findOne, il est indiqué que NumberLong (0) n'est pas aussi 0
rêveur
11
Par défaut, le shell mongo traite tous les nombres comme des valeurs à virgule flottante. Nous devons donc spécifier explicitement le type de numéro que nous voulons utiliser, par exemple NumberInt ou NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu
12
J'ai une question. Le NumberInt n'est fourni que dans le shell mongo, comment faites-vous cela en langage JavaScript comme node.js?
萧 易 客
@Shawyeok voici une réponse stackoverflow.com/a/21870772/3815843
GRiMe2D
Il est important de tenir compte du fait que les pouces ont des limites. Si le nombre est grand, pensez à utiliser NumberLong
Tim Givois
17

Une syntaxe légèrement plus simple (dans Robomongo au moins) a fonctionné pour moi:

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

Si le type de valeur est déjà double, la mise à jour de la valeur avec la commande $ set ne peut pas changer le type de valeur double en int lors de l'utilisation de la fonction NumberInt () ou NumberLong (). Ainsi, pour modifier le type de valeur, il doit mettre à jour l'enregistrement entier.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)
Ethan. Zhang
la source
$setfonctionnait au moins dans Mongo 4.2, donc c'était peut-être un bug.
Cerberus
-10

Eh bien, c'est JavaScript, donc ce que vous avez dans «valeur» est un nombre, qui peut être un entier ou un flottant. Mais il n'y a pas vraiment de différence en JavaScript. De l' apprentissage de JavaScript :

Le type de données numérique

Les types de données numériques en JavaScript sont des nombres à virgule flottante, mais ils peuvent ou non avoir un composant fractionnaire. S'ils n'ont pas de point décimal ou de composant fractionnaire, ils sont traités comme des entiers - des nombres entiers de base 10 dans une plage de –2 53 à 2 53 .

Christian Horsdal
la source
27
En fait, ce n'est pas vrai. Bien que JS ne voit pas de différence, dès que vous vous connectez à mongo à partir d'une autre langue (par exemple java), vous ressentirez la différence.
Omri Spector
2
Mon application ne s'est rompue en différents points que pour une seule raison, int est enregistré et renvoyé en tant que float. Je soupçonne que la cause doit être des insertions manuelles que j'ai faites via le shell mongo qui utilise javascript.
Melsi