Хранение и извлечение объектов JavaScript в / из MongoDB - PullRequest
12 голосов
/ 25 апреля 2011

В настоящее время я играю с node.js и MongoDB, используя драйвер node-mongo-native.

Я немного протестировал использование консоли Mongo для хранения и извлечения объектов JS. Я выяснил, что если я храню объект, который содержит функции / методы, методы и функции также будут храниться в коллекции. Это интересно, так как я думал, что функции не могут быть сохранены в MongoDB (за исключением коллекции system.js, как предложено в Mongo docs ).
Также он будет хранить не только методы, но и фактически каждый метод и элемент всей цепочки прототипов объекта. Кроме того, мне не нравится это поведение, и я думаю, что оно не интуитивно, я не должен иметь его

Я собирался управлять пользователями в коллекции Mongo. Для этого у меня есть объект User, содержащий все методы пользователей, функционирующие как прототип для каждого экземпляра пользователя. Сам объект пользователя будет содержать только атрибуты пользователей.

Если я храню пользователя в коллекции Mongo, я хочу сохранить только собственные свойства объекта пользователя. Нет членов-прототипов и особенно нет прототипов методов. В настоящее время я не вижу, как это сделать чисто. Опции, которые я решил, могут работать:

  1. создание мелкой копии с использованием foreach и hasOwnProperty и сохранение этой копии в коллекции.
  2. Добавить атрибут данных каждому пользователю, который содержит все атрибуты объекта и может храниться в коллекции.
  3. Мне пришло в голову написать следующее: я мог бы также установить для всех свойств прототипов не перечисляемые значения, которые должны помешать их сохранению в коллекции.

Тем не менее, у меня есть те же проблемы с другой стороны: при загрузке пользователя из коллекции. AFAIK нет способа изменить прототип объекта в JavaScript после его создания. Также нет способа указать прототип для использования, когда Mongo создает экземпляры объектов, которые он извлек из коллекции. Так что в основном я всегда получаю объекты, которые наследуются от Object, используя Mongo. Насколько я могу судить, у меня есть 2 варианта восстановления полезного пользовательского объекта с этого момента:

  1. Создание нового объекта, наследуемого от пользователя, и копирование каждого атрибута объекта результата во вновь созданный объект. (Совместимо с механизмами хранения 1 и 3)
  2. Создание нового объекта, наследуемого от пользователя и сохраняющего результирующий объект как атрибут данных на вновь созданном объекте. (Совместимо с механизмом хранения 2)

Верны ли мои предположения, особенно относительно возможности указать прототип для результатов запроса? Какой правильный способ сделать это и почему? Я, конечно, не первый человек, который пытается сохранить и воскресить объекты в / из MongoDB с помощью node.js.

В настоящее время я бы пошел с подходом 2/2. Мне это не очень нравится, но он самый эффективный и единственный, который чисто работает с API. Однако я бы скорее услышал, что на самом деле API не делает ничего плохого, но я не знаю, как правильно его использовать. Поэтому, пожалуйста, просветите меня:)

Ответы [ 2 ]

10 голосов
/ 14 мая 2011

Я только недавно понял, что на самом деле можно изменить прототип объекта в узле V8 /.Хотя это не является стандартом, это возможно в различных браузерах и особенно в V8 / node!

function User(username, email) {
    this.username = username;
    this.email = email;
}

User.prototype.sendMail = function (subject, text) {
    mailer.send(this.email, subject, text);
};

var o = {username: 'LoadeFromMongoDB', email: 'nomail@nomail.no'};
o.__proto__ = User.prototype;
o.sendMail('Hello, MongoDB User!', 'You where loaded from MongoDB, but inherit from User nevertheless! Congratulations!');

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

3 голосов
/ 25 апреля 2011

Я не уверен, что точно слежу за вашим вопросом ... но мне на ум пришла одна вещь: вы проверили Mongoose ORM?(http://mongoosejs.com/)

Это дает вам множество вариантов, когда речь идет об определении моделей и методов. В частности, могут представлять интерес виртуалы (http://mongoosejs.com/docs/virtuals.html).

В любом случае, надеюсь, это поможет).некоторые!

...