参考:(mongoose和mongodb模块的区别)https://www.jianshu.com/p/87bcf4fdb479
参考: mongoose官网(https://mongoosejs.com/docs/models.html)
参考: 英文:Boosting Node.js和MongoDB with Mongoose
Mongoose is a fully developed object document mapping (ODM) library for Node.js and MongoDB.
ODM的概念对应sql的ORM,就是ruby on rails中的activerecord那因层。
activerecord包括migrations, Validations, associations, Query interface, 对应mvc框架中的Models。
ORM, Object-Relational Mappiing。
ODM的作用,定义数据库的数据格式schema, 然后通过它取数据,把数据库中的document映射成程序中的一个对象。这个对象有save, update的系列方法,有tilte, author等系列属性。
在调用这些方法时,odm会根据你调用时使用的条件,转化成mongoDb Shell语言,帮你发送出去。
自然,在程序内使用链式调用,比手写数据库语句更灵活也方便。
例子:
//先安装好MongoDb和Node.js$ npm install mongoose// getting-started.jsvar mongoose = require(‘mongoose‘);mongoose.connect(‘mongodb://localhost:27017/test‘);db.on(‘error‘, console.error.bind(console, "connection error"))db.once(‘open‘, function() { //当连接成功后,写Schema, model, 写实例并保存到数据库。})
在db.once内的例子1
var userSchema = new mongoose.Schema({ user: { username: String, password: String }})var User = mongoose.model(‘user‘, userSchema)var frank = new User({ user: { username: ‘Frank‘, password: ‘123456‘ }})frank.save((err, frank) => { console.log(‘save success!‘) console.log(frank.user)})
在db.once()的例子2
//构建一个Schema var kittySchema = new mongoose.Schema({ name: String }); // 写一个方法 kittySchema.methods.speak = function () { var greeting = this.name ? "Meow name is " + this.name : "I don‘t have a name"; console.log(greeting); } // 生成一个model var Kitten = mongoose.model(‘Kitten‘, kittySchema); // 实例化一个对象 var fluffy = new Kitten({ name: ‘fluffy‘ }); // 通过mongoose写入数据库 fluffy.save((err, fluffy) => { if (err) { return console.error(err) } fluffy.speak() })
??:此时已经将fluffy对象保存到mongodb://localhost:27017/test的Kitten model内。
即将一个document,保存到test数据库的kittens collection中。
model自动创建了kittens这个collection。(自动添加了s)
??注意:此时mongoDb还没有创建kittens
在创建一个实例并执行save方法,test数据库才会创建了kittens collections和documents。
可以对比使用node.js mongodb driver的代码。
var MongoClient = require(‘mongodb‘).MongoClient, assert=require(‘assert‘);var url = ‘mongodb://localhost:27017/myproject‘;MongoClient.connect(url,function(err,db){ assert.equal(null,err); console.log("成功连接到服务器"); insertDocuments(db,function(){ db.close(); }); // db.close();});var insertDocuments = function(db,callback){ var collection = db.collection(‘documents‘); collection.insertMany([ {a:1}, {a:2}, {a:3} ],function(err,result){ assert.equal(err,null); assert.equal(3,result.result.n); assert.equal(3,result.ops.length); console.log("成功插入3个文档到集合!"); callback(result);
});}
上面代码是专为Node.js提供的驱动程序代码和mongDB shell语言类似。
而,用mongoose定位于使用关系型的数据结构schema,来构造你的app data。
它包括内置的类型构件, 验证, 查询,业务逻辑勾子和更多的功能,开箱即用out of the box!
mongoose把你使用Node.js驱动代码自己写复杂的验证,和逻辑业务的麻烦,简单化了。
mongoose建立在MongoDB driver之上,让程序员可以model 化数据。
二者各有优缺点:
mongoose需要一段时间的学习和理解。在处理某些特别复杂的schema时,会遇到一些限制。
但直接使用Node.js的驱动代码,在你进行数据验证时会写大量的代码,而且会忽视一些安全问题。