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.
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?
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)
$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 .
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.
Réponses:
Vous pouvez également utiliser NumberLong.
la source
Une syntaxe légèrement plus simple (dans Robomongo au moins) a fonctionné pour moi:
la source
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.
la source
$set
fonctionnait au moins dans Mongo 4.2, donc c'était peut-être un bug.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 :
la source