2016-07-19 1 views
0

У меня немного странная ситуация.Mongodb не может найти объект слишком долго _id

Я сохраняю объекты в коллекции «refs», явно устанавливая _id. Итак, у меня есть объекты с очень большими идентификаторами.

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

Но когда я пытаюсь найти объект с самым большим идентификатором в Монго оболочки она ничего не возвращает:

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

Но!

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

Как это могло случиться?

+0

Как насчет db.refs.count ({_ id: 9200000000165761625}) –

+0

У меня такая же проблема, как использовать идентификаторы Twitter для моего _id. Изменен код загрузчика python для использования str (tweet.id). –

ответ

0

Я не смог воспроизвести вашу проблему. Я смог успешно запросить заданное значение _id. enter image description here

гарантировать, что когда вы запрашиваете вы передаете правильное название коллекции

+0

FYI проблема по-прежнему очевидна в вашем снимке экрана: значения, превышающие максимально безопасное целое число JavaScript, не могут быть безопасно представлены в оболочке 'mongo'. Вставляемый вами '_id не соответствует значению, которое вы ищете (математически), но оба имеют то же представление, что и номер JavaScript. – Stennie

0

JavaScript в настоящее время имеет только один числовой тип Number, который представляет все значения в качестве значений с плавающей точкой 64-битными. Максимальное безопасное целочисленное представление в собственном типе номера JavaScript - это 2 -1 или 9007199254740991 (возвращаемое константой Number.MAX_SAFE_INTEGER).

Любые целочисленные значения за пределами безопасного диапазона не могут быть представлены отчетливо, поэтому два или более математических значения будут сопоставляться с одним и тем же номером JavaScript.

Вы можете увидеть этот эффект в mongo оболочке со значениями, примыкающего к вашему условию _id (что больше, чем безопасный размера целого):

> 9200000000165761624 
9200000000165762000 

> 9200000000165761625 
9200000000165762000 

> 9200000000165761626 
9200000000165762000 

Однако эти ограничения драйвера/клиент отличается от основного типы данных, используемые в файле MongoDB BSON format для документов. BSON имеет 64-битный целочисленный тип, который представляет полный диапазон значений: до 2 -1 для 64-битных целых чисел.

Ваш пример _id находится в пределах 64-разрядного целочисленного диапазона, поэтому вы должны иметь возможность вставлять или обновлять его с помощью драйвера с поддержкой 64-разрядных целых чисел, но не сможете безопасно запрашивать или обрабатывать длинные значения в mongo оболочка или другие среды JavaScript. Чтобы избежать неожиданных результатов, вы можете использовать другой тип данных для этих длинных значений _id.