Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose

Posted Mr-chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose相关的知识,希望对你有一定的参考价值。

参考:(mongoose和mongodb模块的区别)https://www.jianshu.com/p/87bcf4fdb479

参考: mongoose官网(https://mongoosejs.com/docs/models.html

参考: 英文:Boosting Node.js和MongoDB with Mongoose


 

 

简介: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。

ORMObject-Relational Mappiing。

ODM的作用,定义数据库的数据格式schema, 然后通过它取数据,把数据库中的document映射成程序中的一个对象。这个对象有save, update的系列方法,有tilte, author等系列属性。

在调用这些方法时,odm会根据你调用时使用的条件,转化成mongoDb Shell语言,帮你发送出去。

自然,在程序内使用链式调用,比手写数据库语句更灵活也方便。

 

例子:

//先安装好MongoDb和Node.js
$ npm install mongoose

// getting-started.js
var 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的驱动代码,在你进行数据验证时会写大量的代码,而且会忽视一些安全问题。


 


以上是关于Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose的主要内容,如果未能解决你的问题,请参考以下文章

Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongskin。

Practical Node.js第3章:测试

JSON at Work: Practical Data Integration for the Web (EPUB)

Node.js进入Ubuntu及其他Linux发行版Snap商店

Node.js安装详细步骤教程(Windows版)

Node.js安装+环境配置Windows版