В настоящее время я играю с node.js и MongoDB, используя драйвер node-mongo-native.
Я немного протестировал использование консоли Mongo для хранения и извлечения объектов JS. Я выяснил, что если я храню объект, который содержит функции / методы, методы и функции также будут храниться в коллекции. Это интересно, так как я думал, что функции не могут быть сохранены в MongoDB (за исключением коллекции system.js, как предложено в Mongo docs ).
Также он будет хранить не только методы, но и фактически каждый метод и элемент всей цепочки прототипов объекта. Кроме того, мне не нравится это поведение, и я думаю, что оно не интуитивно, я не должен иметь его
Я собирался управлять пользователями в коллекции Mongo. Для этого у меня есть объект User, содержащий все методы пользователей, функционирующие как прототип для каждого экземпляра пользователя. Сам объект пользователя будет содержать только атрибуты пользователей.
Если я храню пользователя в коллекции Mongo, я хочу сохранить только собственные свойства объекта пользователя. Нет членов-прототипов и особенно нет прототипов методов. В настоящее время я не вижу, как это сделать чисто. Опции, которые я решил, могут работать:
- создание мелкой копии с использованием foreach и hasOwnProperty и сохранение этой копии в коллекции.
- Добавить атрибут данных каждому пользователю, который содержит все атрибуты объекта и может храниться в коллекции.
- Мне пришло в голову написать следующее: я мог бы также установить для всех свойств прототипов не перечисляемые значения, которые должны помешать их сохранению в коллекции.
Тем не менее, у меня есть те же проблемы с другой стороны: при загрузке пользователя из коллекции. AFAIK нет способа изменить прототип объекта в JavaScript после его создания. Также нет способа указать прототип для использования, когда Mongo создает экземпляры объектов, которые он извлек из коллекции. Так что в основном я всегда получаю объекты, которые наследуются от Object, используя Mongo. Насколько я могу судить, у меня есть 2 варианта восстановления полезного пользовательского объекта с этого момента:
- Создание нового объекта, наследуемого от пользователя, и копирование каждого атрибута объекта результата во вновь созданный объект. (Совместимо с механизмами хранения 1 и 3)
- Создание нового объекта, наследуемого от пользователя и сохраняющего результирующий объект как атрибут данных на вновь созданном объекте. (Совместимо с механизмом хранения 2)
Верны ли мои предположения, особенно относительно возможности указать прототип для результатов запроса? Какой правильный способ сделать это и почему? Я, конечно, не первый человек, который пытается сохранить и воскресить объекты в / из MongoDB с помощью node.js.
В настоящее время я бы пошел с подходом 2/2. Мне это не очень нравится, но он самый эффективный и единственный, который чисто работает с API. Однако я бы скорее услышал, что на самом деле API не делает ничего плохого, но я не знаю, как правильно его использовать. Поэтому, пожалуйста, просветите меня:)