Desculpe, não entendi sua pergunta no início e, portanto, forneci a resposta errada (obrigado cababunga por apontar isso). Então aqui está um correto.
O Mongoshell suporta diferentes tipos de dados . E tenta adivinhar seu tipo de dados quando você o insere. Então você insere seu número grande:138548488276343678 . Observe que é maior que 2^31-1, que é o máximo para um inteiro de 32 bits. Então, ele o trata como um float e, como os floats não são armazenados com precisão, ele o modifica um pouco. É por isso que seu número armazenado é quase o mesmo, mas difere um pouco (essa diferença será menor que 8). Mas você deseja armazenar esse número com precisão e o mongo suporta inteiro de 64 bits (que se encaixa no seu inteiro).
Portanto, você precisa especificar que deseja armazená-lo como inteiro de 64 bits . Você pode fazer isso da seguinte maneira:
db.a.insert({
bound:"latest",
id: NumberLong("138548488276343678"), // Note these "". I was not using them and the number was not stored correctly
complete:false
})
Depois disso, você pode recuperar seu documento
db.a.find()
e estará correto. Observe que muitos drivers têm problemas semelhantes e, portanto, você precisa dizer explicitamente que vai salvá-los como um número inteiro de 64 bits. Se você não estiver especificando
_id
para o documento que você está criando, mongodb cria _id
campo por si só. Você pode ler um pouco mais sobre _id
aqui
e na documentação oficial
. Se você tiver seu próprio campo, que gostaria de ser usado como
_id
, em vez de escrever id:138548488276343678
você deve escrever _id : 138548488276343678
. P.S. também porque vejo que você está usando números muito grandes, lembre-se de que os números inteiros no mongodb são armazenados como inteiros de 64 bits (o que significa que está entre -2^63 a 2^63 - 1)