2015-11-27 2 views
4

При отладке обратного вызова mongoose я обнаружил, что либо у underscore.js, либо на языке JavaScript, похоже, проблема с большими числами.Разбивка больших номеров underscore.js _.contains

В приведенном ниже примере я хранил небольшое число и строку, содержащую ObjectId из mongoose (24-значное число), чтобы показать проблему как можно яснее.

var users = ["32", "300000000000000000000002"]; 
alert(_.contains(users, "32")); // true 
alert(_.contains(users, (32).toString())); // true 
alert(_.contains(users, "300000000000000000000002")); // true 
alert(_.contains(users, (300000000000000000000002).toString())); // false - wait wat ? 

Вопрос, конечно, заключается в том, как вернуть последний звонок?

Я бы предпочел не преобразовывать массив users в массив чисел, потому что (1) массив может быть огромным в производственном контексте и (2) мне может потребоваться выполнить другие операции над массивом.

+4

'(300000000000000000000002) .ToString() ===" 3e + 23 "' – Bergi

+2

24 цифры просто для js http://stackoverflow.com/questions/307179/what-is-javascripts-highest-integer-value-that-a-number-can-go-to- без-losin – Pevara

+0

Пока ваш диагностический ввод оценен и помог мне, я все еще ищу решение – blagae

ответ

1

проблемы всегда была, что я получаю входную строку, который автоматически преобразуется в ряд (библиотека). Поэтому мне пришлось только сделать «внешний ключ» меньшим числом. В конце концов я создал пользовательскую функцию номер AutoGenerate, чтобы обойти эту проблему:

var autoIncrement = require('mongoose-auto-increment'); 
var address = require('./Address'); 
var connection = mongoose.createConnection(address.mongo()); 
autoIncrement.initialize(connection); 

var UserSchema = new mongoose.Schema({ /* property definitions */}); 
mongoose.model('User', UserSchema); 

UserSchema.plugin(autoIncrement.plugin, { 
    model: 'User', 
    startAt: 10000001 
}); 

В результате, мне пришлось изменить механизм реферирования:

var GroupSchema = new mongoose.Schema({ 
    users: [{type: Number, ref: 'User'}], 
    /* other property definitions */ 
}); 
3

Последние возвращает "3e+23", которая не является равен "300000000000000000000002"

+0

Хорошо, вы указали действительную техническую причину проблемы. Но есть ли решение? – blagae

Смежные вопросы