2016-12-22 1 views
0

J'ai essayé de mettre à jour un champ dans un document qui était entier long. Mais il a été mis à jour à la valeur '14818435007969200' au lieu de '14818435007969199'.long nombre ne met pas à jour correctement dans mongodb

db.getCollection('title').updateMany({}, 
{$set:{'skillId':[NumberLong(14818435007969199)]}}) 

db.getCollection('title').find({}) 

{ 
    "_id" : ObjectId("5853351c0274072315da2426"), 
    "skillId" : [ 
     NumberLong(14818435007969200) 
    ] 
} 

Y at-il une solution? J'utilise robomongo 0.9.0.

Répondre

1

La coque mongo traite tous les nombres comme des valeurs à virgule flottante. Ainsi, lors de l'utilisation de l'enveloppe NumberLong(), passez la valeur longue en tant que chaîne ou risquez la perte pour des discordances de précision ou de conversion.

Cela devrait fonctionner comme prévu.

db.getCollection('title').updateMany({}, 
{$set:{'skillId':[NumberLong("14818435007969199")]}}) 

Juste pour démontrer par exemple.

Donc, lors de la conversion 14818435007969199 à la valeur de base 2 binaire vous obtenez 110100101001010100100111000010110001101111011110110000 qui, une fois reconverti à la base 10 est 14818435007969200

Vous pouvez extraira le floating point arithmetic pour plus de détails.