camo是针对Node.js和MongoDB的对象模型mapper(object document mapper)(ODM)javascript
能够喝Mongoose ODM互换,可是和其有显著的不一样java
文章主要关注了Mongo ODMs新增的ES6特性,这些特性将不支持例如classes 和 schema 继承等特性web
对于其余语言学习者(例如java),基于类的ODMs他们更加熟悉,由于能够很方便的声明一个基本模块,而后继承此模块。 Mongoose模型的继承性比较差,因此camo中基于类的继承是一个受欢迎的特性。mongodb
当我在使用Mongoose的时候,我嫉妒SQL使用者可使用SQLite来替代更大的相似MySQL或者PostgreSQL同样的数据库。 SQLite是一个轻量级的数据库,用户可使用一个简单的文件做为后端(backend),因此就木有必要下载和安装300MB+(Mac OSX 压缩版本)MySQL到你的电脑中来运行数据库操做。数据库
此外,MongoDB还有一个愈加流行的NeDB,这将存储数据到一个单一的文件(或者内存中),且针对Node.js Mongo Driver有一个相同的API。npm
和Mongoose不一样的是,Camo 支持 NeDB 做为后端(backend),因此你不须要安装全部的MongoDB数据库,若是你不想安装的话。这对开发和测试提供了很大便利,由于其减小了本地依赖(local dependencies) 且让你的应用程序更加便携——NeDB是一个你能够从NPM简单安装的包。 因此只要你想要,你彻底能够在建立产品初始阶段使用NeDB做为数据库,以后再将其扩大成一个完整的Mongo 数据库若是你的数据负载量增大。json
链接到数据库后端
为了支持不一样的数据库后端(database backends),camo经过一个URL字符串来了解从哪里以及怎样链接到你的数据库。以下例:app
***javascript var connect = require('camo').connect; // Local Mongo database connect('mongodb://localhost/camo_test').then(function(db) { // ... }); // NeDB takes a directory path... connect('nedb:///Users/scott/data/animals').then(function(db) { // ... }); // ...or 'memory' for storing data in-memory connect('nedb://memory').then(function(db) { // ... }); ```
一旦你链接到数据库,你能够开始建立而且保存你的模型(models)webapp
建立你本身的模型
建立一个模型,你要作的就是扩展(extend)文档类型(the 'Document' class)而且具体化你的模式(schema)。给你能够覆盖的‘ static collectionName()’方法命名,且返回任何你想要的名称;或者,若是你不想要指定一个特定的名字,camo将会使用c类名且增长一个s到名字的末尾让其变成复数形式。
***javascript var Document = require('camo').Document; class User extends Document { constructor() { super(); this.email = { type: String, unique: true }; this.password = String; this.firstName = String; this.lastName = String; this.age = Number; this.created = { type: Date, default: Date.now }; this.previousLogins = [Date]; } static collectionName() { return 'users'; } }
上面咱们申明了‘User’对象,这个对象包含了典型的用户数据,好比email,密码和姓名。你可能主语到声明schema的构造器使用了内置的JavaScript对象好比‘String’,'Number'和‘Date’。任何没有使用下划线做为前缀来声明的内容都包含在这个schema中。
在这些模型类中你可使用全部典型的类特性,好比getters/setters,静态方法等等
***javascript var Document = require('camo').Document; class User extends Document { constructor() { super(); // User schema here... } get fullName() { return this.firstName + ' ' + this.lastName; } canVote() { return this.age >= 18; } static getVoters() { return User.loadMany({ age: { $gte: 18 } }); } }
虽然ES6中的类语法只是一个糖衣语法(syntactic sugar),可是相对于旧的原型链方式,其更加便捷,易熟悉和易理解,特别是针对刚学JavaScript的用户而言。
保存一个文档
你若是想建立和保存一个新的用户,那么你须要使用'.create()'和'.save()'方法,以下
***javascript var connect = require('camo').connect; connect('mongodb://localhost/camo_test').then(function(db) { var user = User.create({ email: 'billy@example.com', password: 'sekret', name: 'Billy Bob', age: 28, previousLogins: [Date.now()] }); return user.save(); }).then(function(u) { console.log('Saved user Billy!'); });
如上,你刚刚建立且保存了一个用户到MongoDB中
继承
如今要讲述Camo中最棒的部分啦。假设在你的webapp中,你有两个不一样类型的用户类型——普通用户和高级用户。高级用户相对于普通用户有更多的特权和更多的相似支付信息等的数据。 为了不只是为了增长额外的支付信息而从新书写'User' 模式(schema),咱们可使用继承:
***javascript class ProUser extends User { constructor() { super(); this.cardNumber = String; this.cardExp = String; this.cardSecurityCode = String; this.lastPayment = Date; } }
你可使用继承屡次。继承将继承父类到子模式(schemas)中;若是父模式(schemas)或者其中的方法不知足你的设计,你能够覆盖它们。
内嵌数据
由于MongoDB数据不是写死的,这也是咱们首先考虑使用它的缘由。因此,当你想要增长一些好比地址的内置数据时,该怎么作?
你可以使用‘EmbeddedDocument’来声明模式(shcema),并将其加入到已经存在的文档类(document class)中间。这些内置的文档不会被保存为单独的文档,能够被保存在其余的模式(schemas)中:
***javascript var EmbeddedDocument = require('camo').EmbeddedDocument; // User class here... class Address extends EmbeddedDocument { constructor() { super(); this.addressLine1 = String; this.addressLine2 = String; this.city = String; this.state = String; this.zip = String; } } class ProUser extends User { constructor() { super(); // Credit card details here... this.billingAddress = Address; this.shippingAddress = Address; } }
这然呢能够对待内置对象继续昂对待其余'Dpcument'对象同样,因此你可给其设置getters/setters,实例方法和静态方法。在全部的继承和内置模式(nested schemas)添加了以后,咱们能够建立一个最终的以下乐死的文档
***json { "email": "billy@example.com", "password": "a434287b3bfdd8de9f9f166f926dca10", "firstName": "Billy", "lastName": "Bob", "age": 28, "created": ISODate("2015-09-22T01:43:24.928Z"), "previousLogins": [ISODate("2015-11-16T03:53:46.678Z")], "cardNumber": "4242424242424242", "cardExp": "11/15", "cardSecurityCode": "123", "lastPayment": ISODate("2015-09-22T01:43:24.928Z"), "billingAddress": { "addressLine1": "123 Fake St.", "addressLine2": "", "city": "Cityville", "state": "NE", "zip": "12345" }, "shippingAddress": { "addressLine1": "321 Code Circle", "addressLine2": "Suite 26", "city": "Villageville", "state": "NE", "zip": "54321" } }
你得到了全部这些能够从新再shcemas中从新利用的代码,以后,你若是决定你的‘Address’内置数据须要包含‘Attn’这一行,你能够增长它,且其会包含到任何使用‘Address’ ‘EmbeddedDocument’的地方。
加载和删除文档
如今,你若是想要备份数据,那么可使用相似针对MongoDb JavaScript驱动器的loadOne()和loadMany()方法。
***javascript User.loadOne({email: 'billy@example.com'}).then(function(user) { console.log('Found user:', user.id); });
删除文档,你能够在对象实例自己调用delete()方法,或者使用下面的静态方法:
‘deleteOne(query, options)’
`deleteMany(query, options)`
`loadOneAndDelete(query, options)`
结束语:
能够看更多的有关camo的内容(validation,hooks等等)
原文连接:https://blog.xervo.io/npm-install-camo