Представляем Camo: ES6 ODM на основе классов для Mongo-подобных баз данных

Изменить: обновлен код камуфляжа до версии v0.12.1 Что такое камуфляж? Camo [https://github.com/scottwrobinson/camo] - это ODM ES6 с моделями на основе классов. Некоторые из его основных функций: чрезвычайно простое объявление схемы, интуитивно понятное наследование схемы и поддержка нескольких бэкэндов базы данных. Простая модель Camo может выглядеть так: var Document = require ('camo'). Document; класс Car расширяет Document {конструктор () {super (); this.make = String; this.miles = Число; this.numWheels = {тип: Число;

Изменить : обновлен код Camo до версии v0.12.1.

Что такое камуфляж?

Camo - это ES6 ODM с моделями на основе классов. Некоторые из его основных функций: чрезвычайно простое объявление схемы, интуитивно понятное наследование схемы и поддержка нескольких бэкэндов базы данных.

Простая модель Camo может выглядеть так:

 var Document = require('camo').Document; 
 
 class Car extends Document { 
 constructor() { 
 super(); 
 
 this.make = String; 
 this.miles = Number; 
 this.numWheels = { 
 type: Number; 
 default: 4 
 }; 
 } 
 } 

Для установки просто используйте:

 npm install camo --save 
 
 AND 
 
 npm install nedb --save 
 OR 
 npm install mongodb --save 

Зачем еще один ODM?

Как бы я ни хотел любить Мангуста, как и все остальные, я просто не мог заставить себя принять это. Возможно, это произошло из-за того, что я все еще был новичком в JavaScript и не совсем воспринял аспект функционального программирования в той мере, в какой должен был, но я остался разочарован тем, как были объявлены модели и отсутствием наследования схемы (или, по крайней мере, это неуклюжесть ).

Исходя из опыта Java, я очень люблю классы. Поэтому мне было сложно проектировать модели, не имея возможности использовать классы или наследование. Увидев, что ES6 поддерживает традиционные классы и наследование, я был удивлен, обнаружив, что ODM для Node.js не основаны на классах.

Наконец, мне понравилось, как в SQL вы можете легко переключаться между небольшими портативными базами данных, такими как SQLite для разработки, и более крупными и более масштабируемыми базами данных, такими как PostgreSQL для производства. Видя, как NeDB прекрасно заполняет этот пробел для MongoDB, я хотел ODM, который позволил бы мне легко переключаться между этими базами данных.

Функции

Классы

Как упоминалось выше, Camo вращается вокруг классов ES6 для создания моделей. Каждая модель должна расширять класс Document EmbeddedDocument или другую модель. Схемы объявляются в конструкторах, где вы можете указать тип данных, значения по умолчанию, варианты выбора и другие валидаторы.

Виртуальные объекты, методы и статика могут использоваться для управления данными модели и их извлечения, как обычный непостоянный класс.

 var Document = require('camo').Document; 
 
 class Manufacturer extends Document { 
 constructor() { 
 super(); 
 
 this.name = String; 
 } 
 } 
 
 class Car extends Document { 
 constructor() { 
 super(); 
 
 this.make = Manufacturer; 
 this.model = String; 
 this.year = { 
 type: Number, 
 min: 1900, 
 max: 2015 
 }; 
 this.miles = { 
 type: Number, 
 min: 0 
 }; 
 this.numWheels = { 
 type: Number; 
 default: 4 
 }; 
 } 
 
 get isUnderWarranty() { 
 return this.miles < 50000; 
 } 
 
 milesPerYear() { 
 return this.miles / (new Date().getFullYear() - this.year) 
 }; 
 } 

Встроенные документы

Одним из основных преимуществ использования MongoDB является его вложенная структура данных, и вы легко сможете воспользоваться ею в своем ODM. Camo имеет встроенную поддержку документов, поэтому вы можете обрабатывать данные вложенного документа так же, как и обычный документ.

 var Document = require('camo').Document; 
 var EmbeddedDocument = require('camo').EmbeddedDocument; 
 
 class Warranty extends EmbeddedDocument { 
 constructor() { 
 super(); 
 
 this.miles = Number; 
 this.years = Number; 
 this.isUnlimitedMiles = Boolean; 
 } 
 
 isCovered(car) { 
 var thisYear = new Date().getFullYear(); 
 return ((car.miles <= this.miles) || this.isUnlimitedMiles) && 
 ((thisYear - car.year) <= this.years) 
 }; 
 } 
 
 class Manufacturer extends Document { 
 constructor() { 
 super(); 
 
 this.name = String; 
 
 this.basicWarranty = Warranty; 
 this.powertrainWarranty = Warranty; 
 this.corrosionWarranty = Warranty; 
 } 
 } 

Поддержка нескольких баз данных

Не каждому проекту требуется огромная база данных с репликацией, балансировкой нагрузки и поддержкой миллионов операций чтения / записи в секунду, и именно поэтому для Camo было важно поддерживать несколько бэкэндов баз данных, таких как NeDB.

Большинство проектов начинаются с малого и в конечном итоге перерастают в более крупные и популярные продукты, требующие более быстрых и надежных баз данных. С NeDB вы получаете подмножество наиболее часто используемых команд API MongoDB без необходимости настраивать полную базу данных. Это похоже на эквивалент SQLite, но для Mongo. Для переключения между базами данных просто укажите другую строку подключения.

 var connect = require('camo').connect; 
 
 var uri; 
 var neUri = 'nedb://memory'; 
 var mongoUri = 'mongodb://localhost/car-app'; 
 
 uri = neUri; 
 if (process.env.NODE_ENV === 'production') { 
 uri = mongoUri; 
 } 
 
 connect(uri).then(function(db) { 
 // Ready to use Camo! 
 }); 

Начиная с v0.5.5, Camo поддерживает MongoDB и NeDB. Мы планируем добавить поддержку большего количества Mongo-подобных баз данных, включая LokiJS и TaffyDB . С NeDB и дополнениями LokiJS и TaffyDB вы также можете использовать Camo в браузере.

Наследование

Возможно, одна из лучших особенностей Camo - это наследование схемы. Просто используйте наследование класса ES6 для расширения схемы.

 var Document = require('camo').Document; 
 
 class Vehicle extends Document { 
 constructor() { 
 super(); 
 
 this.make = String; 
 this.model = String; 
 this.year = Number; 
 this.miles = Number; 
 } 
 } 
 
 class Car extends Vehicle { 
 constructor() { 
 super(); 
 
 this.numberOfDoors = String; 
 } 
 } 

Подклассы могут переопределять или расширять любые схемы, виртуальные объекты, методы или статику, что приводит к более удобочитаемому и простому коду.

Готов ли Camo к производству?

Хотя в Camo уже есть немало функций и лишь несколько известных ошибок, работа над ним все еще продолжается. Вот краткий список основных функций, которые мы все еще хотим добавить в проект перед объявлением версии 1.0:

  • Вернуть Query из findOne / find / delete / etc
  • Добавить поддержку пропуска / ограничения в запросы
  • Добавить параметр для заполнения только указанных ссылок
  • Добавить поддержку LokiJS и TaffyDB

Это , как говорится, Camo уже используется в производстве кода над на Polymetrics (а SaaS , которая предоставляет метрики для Stripe). Кодовая база для Polymetrics изначально была построена на Mongoose, но затем без каких-либо проблем была заменена на Camo. Теперь тестирование и разработка стали намного проще, поскольку мы можем легко переключаться между базами данных.

Camo также значительно упростил разработку моделей для Polymetrics. Большая часть данных, которые нам нужно загрузить и сохранить из Stripe, имеет одни и те же поля (например, даты, метаданные и т. Д.), Поэтому расширение общей схемы позволило нам писать меньше кода, а также позволило нам изменить только базу. schema вместо того, чтобы вносить одно и то же изменение во многие файлы.

Заключение

Зайдите на страницы npm или Github и ознакомьтесь с проектом. README в настоящее время является лучшим источником документации , поэтому, если чего-то не хватает, дайте мне знать.

Как всегда, приветствуются любые предложения, вопросы, отзывы или запросы на включение! Не стесняйтесь обращаться ко мне через Twitter , Github или по электронной почте .

comments powered by Disqus