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
.
Как насчет db.refs.count ({_ id: 9200000000165761625}) –
У меня такая же проблема, как использовать идентификаторы Twitter для моего _id. Изменен код загрузчика python для использования str (tweet.id). –