Начало работы с камуфляжем

Изменить: обновлен код до Camo v0.12.1 Введение Прежде всего, Camo [https://github.com/scottwrobinson/camo] - это новый ODM ES6 на основе классов для MongoDB и Node. Поскольку к нам быстро приближался основной ES6, я подумал, что нам давно пора для ODM, который использовал бы преимущества новых функций, поэтому я создал Camo. При переходе с Java на JavaScript меня больше всего беспокоило отсутствие классов в традиционном стиле. Я думаю, особенно для новичков, это важная функция для

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

Вступление

Прежде всего, Camo - это новый ODM ES6 на основе классов для MongoDB и Node. Поскольку к нам быстро приближался основной ES6, я подумал, что нам давно пора для ODM, который использовал бы преимущества новых функций, поэтому я создал Camo. При переходе с Java на JavaScript меня больше всего беспокоило отсутствие классов в традиционном стиле. Я думаю, особенно для новичков, это важная функция для любого ODM.

В этом уроке я покажу вам, как использовать основные функции Camo (объявление схемы, сохранение, загрузка и т. Д.). Чтобы упростить сравнение с Mongoose, я покажу аналогичные примеры в статье Начало работы с Mongoose . Надеюсь, отсюда вы сможете решить, какой стиль / функциональность вам больше всего нравится для использования в ваших проектах.

Подключение Camo к MongoDB

Примечание . Код в этой статье использует версию Camo v0.12.1.

Чтобы подключить Camo к вашей базе данных, просто передайте строку подключения (обычно в форме mongodb://[ip-address]/[db-name] connect() , который вернет экземпляр клиента Camo. Экземпляр клиента можно использовать для настройки БД, но он не нужен для объявления, сохранения или удаления ваших документов.

 var connect = require('camo').connect; 
 
 var database; 
 var uri = 'mongodb://localhost/test'; 
 connect(uri).then(function(db) { 
 database = db; 
 }); 

Схемы и модели

Модели объявляются с использованием классов ES6 и должны расширять объект Document Схема модели объявляется в конструкторе, и любая переменная-член, которая не начинается с подчеркивания ( _ ), включается в схему и сохраняется в БД. Переменная-член может быть объявлена либо путем прямого присвоения ей типа, либо путем назначения ей объекта с параметрами.

 var Document = require('camo').Document; 
 
 class Movie extends Document { 
 constructor() { 
 super(); 
 
 this.title = String; 
 this.rating = { 
 type: String, 
 choices: ['G', 'PG', 'PG-13', 'R'] 
 }; 
 this.releaseDate = Date; 
 this.hasCreditCookie = Boolean; 
 } 
 
 static collectionName() { 
 return 'movies'; 
 } 
 } 

Имя коллекции объявляется путем переопределения статического метода collectionName() Хотя это имя редко требуется в коде, оно станет полезным при проверке базы данных MongoDB вручную, поэтому лучше всего сохранить его соответствие имени модели.

Если collectionName() не указан, Camo автоматически присвоит имя коллекции на основе имени класса.

Создание, получение, обновление и удаление (CRUD)

Чтобы создать экземпляр модели, просто используйте метод create() , который выполняет большую часть работы по созданию экземпляра за вас. create() можно передать данные, которые будут присвоены переменным-членам. Если данные для переменной не передаются, ей либо присваивается значение по умолчанию (если указано в схеме), либо присваивается значение null .

 var thor = Movie.create({ 
 title: 'Thor', 
 rating: 'PG-13', 
 releaseDate: new Date(2011, 4, 2), 
 hasCreditCookie: true 
 }); 
 
 thor.save().then(function(t) { 
 console.log(thor); 
 }); 

При сохранении экземпляра данные будут вставлены в базу данных, если они не были ранее сохранены. Если экземпляр уже был сохранен в базе данных, существующий документ обновляется с учетом изменений.

Чтобы удалить документ, просто вызовите для него метод delete Вы также можете использовать статические deleteOne() , deleteMany() или findOneAndDelete() в классе модели. Количество документов, удаленных из базы данных, будет возвращено в Promise .

 thor.delete().then(function(numDeleted) { 
 console.log(numDeleted); 
 }); 

Чтобы загрузить документ из базы данных, у вас есть несколько вариантов в зависимости от того, что вы хотите сделать. Возможные варианты:

  • findOne() для загрузки одного документа (или null, если он не существует)
1
<!-- -->
 // Load only the 'Thor' movie 
 Movie.findOne({ title: 'Thor' }).then(function(movie) { 
 console.log(thor); 
 }); 
  • find() для загрузки нескольких документов (или пустого массива, если их нет)
1
<!-- -->
 // Load all movies that have a credit cookie 
 Movie.find({ hasCreditCookie: true }).then(function(movies) { 
 console.log(thor); 
 }); 
  • findOneAndUpdate() для получения документа и его обновления за одну атомарную операцию
1
<!-- -->
 // Update 'Thor' to have a rating of 'R' 
 Movie.findOneAndUpdate({ title: 'Thor' }, { rating: 'R' }).then(function(movies) { 
 console.log(thor); 
 }); 

Дополнительно

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

 var Document = require('camo').Document; 
 
 class Movie extends Document { 
 constructor() { 
 super(); 
 
 // Schema declaration here... 
 } 
 
 set releaseYear(year) { 
 this.releaseDate.setYear(year); 
 } 
 
 get releaseYear() { 
 return this.releaseDate.getFullYear(); 
 } 
 
 yearsOld() { 
 return new Date().getFullYear() - this.releaseDate.getFullYear(); 
 } 
 
 static findAllRMovies() { 
 return this.find({ rating: 'R' }); 
 } 
 } 
 
 var uri = 'nedb://memory'; 
 
 connect(uri).then(function(db) { 
 var thor = Movie.create({ 
 title: 'The Matrix', 
 rating: 'R', 
 releaseDate: new Date(1999, 2, 31), 
 hasCreditCookie: true 
 }); 
 
 return thor.save(); 
 }).then(function(t) { 
 return Movie.findAllRMovies(); 
 }).then(function(movies) { 
 movies.forEach(function(m) { 
 console.log(m.title + ': ' + m.releaseDate.getFullYear()); 
 }); 
 }); 

Помимо взаимодействия с MongoDB, Camo также поддерживает NeDB , который похож на SQLite-эквивалент Mongo. Пример использования NeDB показан выше. Его очень полезно использовать во время разработки и тестирования, поскольку данные могут храниться либо в файле, либо просто в памяти. Это также означает, что вы можете использовать Camo в коде интерфейсного браузера!

Перейдите на страницу проекта для получения дополнительной информации. Нравится то, что вы видите? Начните проект и расскажите о нем!

comments powered by Disqus