2015-02-18 2 views
5

Есть ли node.js модуль, который позволяет мое приложение, чтобы иметь одни и те же типы, как MongoDB:типы MongoDB в Node.js

http://docs.mongodb.org/manual/reference/bson-types/

К примеру, в моем Node.js приложение, я хочу это чтобы иметь полное представление о типе Integer, но node.js не понимает ничего, кроме номера из коробки, к моему пониманию.

+4

Кто голосовал бы, чтобы закрыть этот совершенно хороший вопрос? Это очень ясно, по теме и очень актуально. – Brad

+0

серьезно, спасибо Брэду за поддержку мне –

+1

Не совсем уверен, чего вы пытаетесь достичь, но мы действительно нашли мангуста очень полезным слоем для того, чтобы мы стандартизовали данные и типы данных. По крайней мере, имея схему, по крайней мере, представила согласованную схему между всеми. – CargoMeister

ответ

3

node.js не понимает ничего, кроме номера из коробки, насколько мне известно.

Ну, это дизайнерское решение JavaScript. JavaScript только имеет тип Number, то есть, если реализация соответствует рекомендации стандарта, represented as IEEE-754 double precision floating point number. Это скрывает большую часть сложности short против long против float против double и всех других числовых типов, которые распространены на большинстве других языков. Это также хороший компромисс, потому что они имеют целую точность до 2^53 - 1, поэтому вам редко нужно что-то вне этого диапазона, большую часть времени, и если вы это делаете, то long обычно не режет его ...

MongoDB, с другой стороны, написан на C++ и, таким образом, намного ближе к подробным сведениям о том, как данные фактически хранятся в памяти. Преодоление этого разрыва не является тривиальным.

Есть ли модуль node.js, который позволяет моему приложению иметь те же типы, что и MongoDB?

В каком-то смысле вы сражаетесь с базовым языком программирования. Если бы такой модуль существовал, ему также пришлось бы каким-то образом реализовать целый ряд операций , например. длинное сложение (для результатов> 2^53-1) принципиально иным способом. Например, он мог бы сделать это, преобразовывая цифры в строку и добавляя отдельные цифры вручную, что было бы ужасно медленным.

Что-то подобное происходит в оболочке монго, например. для очень длинных целых чисел он использует синтаксис, например NumberLong("1223"). Но он не переустанавливает операции , он возвращается к регулярному JavaScript V8. Доказательство:

> var foo = NumberLong("36028797018963968") // 2^55 
> var foo2 = foo + NumberLong("1") 
> foo2 
36028797018963970 // should be 36028797018963969 

В качестве альтернативы, такой модуль может быть собственный модуль, который использовал существующие реализации нативного языка программирования, таких как C++. Есть node module called 'edge' that apparently does it for C#. Тем не менее, это сопряжено с довольно сложной задачей, потому что для пересечения границ языка требуется marshalling, что дорого и сложно.

Другими словами: для получения действительно другого набора типов требуется другой язык программирования. Составляя свой код , примерно можно придерживаться вашей схемы, например. через mongoose или через кодирующую дисциплину, но это не сделает JS строго типизированным.

+0

спасибо, я думаю, что грубо придерживаться монгольских типов достаточно хорошо. У меня недостаточно опыта работы с MongoDB, чтобы узнать, можно ли настроить MongoDB на выброс ошибок, если неправильный тип вставлен в документ, но в любом случае идея состоит в том, чтобы поймать это в самом приложении до того, как это произойдет. Точно повторное копирование типов MongoDB в JS может быть как очень сложным, так и ненужным, как вы предлагаете. Я согласен с тем, что Mongoose на правильном пути, я просто хочу что-то специфичное для Meteor и немного лучше, чем Mongoose. –

+1

Ну, MongoDB позволяет хранить документы, которые выглядят совершенно по-разному в одной коллекции, поэтому MongoDB сам не может быть настроен для принудительной реализации схемы. Я, к сожалению, не эксперт по Meteor или Node, но появился быстрый поиск Collection2 и его подпроект https://github.com/aldeed/meteor-simple-schema и peerdb: https://github.com/peerlibrary/meteor-peerdb, возможно, что помогает – mnemosyn

+0

. Тогда мне интересно, почему у MongoDB есть типы - возможно вы можете читать типы при вводе данных в приложение. –