2016-07-19 2 views
0

J'ai une situation un peu étrange.Mongodb ne peut pas trouver l'objet avec trop long _id

Je conserve des objets dans la collection "refs" définissant explicitement _id. J'ai donc des objets avec de très gros ID.

db.refs.find().sort({_id: -1}); 
// {_id: 9200000000165761625} 
// ... 

Mais lorsque je tente de trouver l'objet avec le plus grand id dans mongo shell, il ne retourne rien:

db.refs.find({_id: 9200000000165761625}); // nothing 

Mais!

db.refs.find({_id: 9200000000165761625}).count(); // return 1 

Comment cela est-il arrivé?

+0

Qu'en est-il de db.refs.count ({_ id: 9200000000165761625}) –

+0

J'ai le même problème en essayant d'utiliser les identifiants de Twitter comme mon _id. Changement du code du chargeur python pour utiliser str (tweet.id). –

Répondre

0

Je n'ai pas pu reproduire votre problème. J'ai réussi à interroger la valeur _id que vous avez spécifiée. enter image description here

assurez-vous que lorsque vous interrogez vous passez nom de la collection correcte

+0

FYI le problème est toujours évident dans votre capture d'écran: les valeurs plus longues que l'entier sécurisé maximum de JavaScript ne peuvent pas être représentées en toute sécurité dans le shell 'mongo'. Le '_id' que vous avez inséré ne correspond pas à la valeur que vous recherchez (mathématiquement) mais les deux finissent par avoir la même représentation qu'un numéro JavaScript. – Stennie

0

JavaScript actuellement ne dispose que d'un seul type numérique Number, qui représente toutes les valeurs en tant que valeurs à virgule flottante 64 bits. La représentation entière maximale sûre dans le type numérique natif de JavaScript est 2 -1 ou 9007199254740991 (comme renvoyé par la constante Number.MAX_SAFE_INTEGER).

Les valeurs entières au-delà de la plage sûre ne peuvent pas être représentées distinctement, ainsi deux valeurs mathématiques ou plus seront mappées vers le même numéro JavaScript.

Vous pouvez voir cet effet dans la coquille mongo avec des valeurs adjacentes à votre condition _id (qui est plus grande que la taille entière sécurité):

> 9200000000165761624 
9200000000165762000 

> 9200000000165761625 
9200000000165762000 

> 9200000000165761626 
9200000000165762000 

Cependant, ces pilotes/limitations clients sont distincts du sous-jacent types de données utilisés dans MongoDB BSON format pour les documents. BSON a un type entier de 64 bits qui représente la plage complète de valeurs: jusqu'à 2 -1 pour les entiers 64 bits. Votre exemple _id est dans la plage de nombres entiers 64 bits, vous devriez donc pouvoir l'insérer ou le mettre à jour en utilisant un pilote prenant en charge les entiers 64 bits, mais vous ne pourrez pas interroger ou manipuler en toute sécurité des valeurs longues dans le mongo shell ou d'autres environnements JavaScript. Pour éviter des résultats inattendus, vous pouvez utiliser un type de données différent pour ces longues valeurs _id.