O MongoDB insere float ao tentar inserir um número inteiro

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

Como faço para o Mongo inserir um número inteiro?

Obrigado

sonhador
fonte
qual versão do mongodb você usa?
kamaradclimber
1
note que no meu caso, quando eu queria {$ set: {val: NumberInt (0)}} em algum "val" que já esteja definido como Long, isso não foi alterado. Eu tinha que primeiro alterá-lo para algum outro valor, então alterá-lo de volta a 0, para o NumberInt (0) para entrar em vigor
kommradHomer
Eu tive o mesmo problema, depois de perceber que alterei por engano um int32 para dobrar, configurá-lo novamente usando NumberInt () não corrigia o tipo, a menos que eu mudasse para um valor diferente.
user1055568

Respostas:

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

Você também pode usar NumberLong.

Bernie Hackett
fonte
1
mas em findOne diz NumberLong (0) não como 0
daydreamer
11
Por padrão, o mongo shell trata todos os números como valores de ponto flutuante. Portanto, precisamos especificar explicitamente que tipo de número queremos usar, por exemplo, NumberInt ou NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu
12
Eu tenho uma pergunta. O NumberInt é fornecido apenas no mongo shell, como você faz isso na linguagem JavaScript como node.js?
萧易客
@Shawyeok aqui está uma resposta stackoverflow.com/a/21870772/3815843
GRiMe2D 9/16
É importante levar em consideração que ints têm limites. Se o número for grande, considere usar NumberLong
Tim Givois
17

Uma sintaxe um pouco mais simples (pelo menos em Robomongo) funcionou para mim:

db.database.save({ Year : NumberInt(2015) });
Grade Trekkor
fonte
5

Se o tipo de valor já for duplo, atualize o valor com o comando $ set, não é possível alterar o tipo de valor double para int ao usar a função NumberInt () ou NumberLong (). Portanto, para alterar o tipo de valor, ele deve atualizar o registro inteiro.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)
Ethan. Zhang
fonte
$setfuncionou pelo menos no Mongo 4.2, então talvez isso tenha sido um bug.
Cerberus
-10

Bem, é JavaScript, então o que você tem em 'value' é um Número, que pode ser um número inteiro ou um número flutuante. Mas não há realmente nenhuma diferença no JavaScript. De Aprendendo JavaScript :

O Número Tipo de Dados

Os tipos de dados numéricos no JavaScript são números de ponto flutuante, mas podem ou não ter um componente fracionário. Se eles não tiverem um ponto decimal ou componente fracionário, serão tratados como números inteiros - números inteiros da base 10 em um intervalo de –2 53 a 2 53 .

Christian Horsdal
fonte
27
Atualmente isso não é verdade. Enquanto o JS não vê diferença, assim que você se conectar ao mongo de outro idioma (por exemplo, java), você sentirá a diferença.
Omri Spector
2
Meu aplicativo foi quebrado em pontos diferentes apenas por um motivo: int é salvo e retornado como float. Eu suspeito que a causa deve ser algumas inserções manuais que fiz via mongo shell que usa javascript.
Melsi 07/11