前面的话

  Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具。本文将详细介绍如何使用Mongoose来操作MongoDB

 

NodeJS驱动

  在介绍Mongoose之前,首先介绍使用NodeJS操作MongoDB的方法

  如果使用程序操作数据库,就要使用MongoDB驱动。MongoDB驱动实际上就是为应用程序提供的一个接口,不同的语言对应不同的驱动,NodeJS驱动不能应用在其他后端语言中

  首先,安装mongodb

npm install mongodb

  接着,使用require()方法引入mongodb数据库;然后使用MongoClient对象的connect()方法连接mongodb;最后通过node来对mongodb进行异步的增删改查

  在mongodb数据库中建立db1数据库,然后通过以下代码,建立col集合,并插入{"a":1}文档

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongodb = require('mongodb');
mongodb.MongoClient.connect("mongodb://localhost/db1",function(err,db){    if(!err){
        db.collection("col").insert({"a":1},function(err,result){            if(!err){
                console.log(result);
            }
        })
    }
})

iOS培训,Swift培训,苹果开发培训,移动开发培训

  最后返回结果如下

{ result: { ok: 1, n: 1 },
  ops: [ { a: 1, _id: 597077dc271d092728caa362 } ],
  insertedCount: 1,
  insertedIds: [ 597077dc271d092728caa362 ] }

 

概述

  Mongoose是NodeJS的驱动,不能作为其他语言的驱动。Mongoose有两个特点

  1、通过关系型数据库的思想来设计非关系型数据库

  2、基于mongodb驱动,简化操作

iOS培训,Swift培训,苹果开发培训,移动开发培训

  Mongooose中,有三个比较重要的概念,分别是Schema、Model、Entity。它们的关系是:Schema生成Model,Model创造Document,Model和Document都可对数据库操作造成影响,但Model比Document更具操作性

  Schema用于定义数据库的结构。类似创建表时的数据定义(不仅仅可以定义文档的结构和属性,还可以定义文档的实例方法、静态模型方法、复合索引等),每个Schema会映射到mongodb中的一个collection,Schema不具备操作数据库的能力

  Model是由Schema编译而成的构造器,具有抽象属性和行为,可以对数据库进行增删查改。Model的每一个实例(instance)就是一个文档document

  Document是由Model创建的实体,它的操作也会影响数据库

 

安装

  安装nodejsmongodb之后 ,使用npm来安装mongoose

npm install mongoose

iOS培训,Swift培训,苹果开发培训,移动开发培训

  安装成功后,就可以通过 require('mongoose') 来使用

 

连接数据库

  使用require()方法在项目中包含mongoose后,接下来使用connect()方法连接到MongoDB数据库

【connect()】

mongoose.connect(url);

  connect()最简单的使用方式,就是只要传入url参数即可,如下所示。连接到本地localhost的db1服务器

mongoose.connect('mongodb://localhost/db1');

  如果还需要传递用户名、密码,则可以使用如下方式

mongoose.connect('mongodb://username:password@host:port/database?options...');

  connect()方法还接受一个选项对象options,该对象将传递给底层驱动程序。这里所包含的所有选项优先于连接字符串中传递的选项

mongoose.connect(uri, options);

  可用选项如下所示

iOS培训,Swift培训,苹果开发培训,移动开发培训

 db            -数据库设置
 server        -服务器设置
 replset       -副本集设置
 user          -用户名
 pass          -密码
 auth          -鉴权选项
 mongos        -连接多个数据库
 promiseLibrary

iOS培训,Swift培训,苹果开发培训,移动开发培训

iOS培训,Swift培训,苹果开发培训,移动开发培训

var options = {
  db: { native_parser: true },
  server: { poolSize: 5 },
  replset: { rs_name: 'myReplicaSetName' },
  user: 'myUserName',
  pass: 'myPassword'}
mongoose.connect(uri, options);

iOS培训,Swift培训,苹果开发培训,移动开发培训

  如果要连接多个数据库,只需要设置多个url以,隔开,同时设置mongos为true

mongoose.connect('urlA,urlB,...', {
   mongos : true })

  connect()函数还接受一个回调参数

mongoose.connect(uri, options, function(error) {});

   执行下列代码后,控制台输出“连接成功”

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://localhost/test", function(err) {    if(err){
        console.log('连接失败');
    }else{
        console.log('连接成功');
    }
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

   如果开启鉴权控制,以用户名"u1",密码"123456"登录'db1'数据库。执行代码后,控制台输出“连接成功”

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(err){
        console.log('连接失败');
    }else{
        console.log('连接成功');
    }
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

【disconnect()】 

mongoose.disconnect()

   使用disconnect()方法可以断开连接

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(err){
        console.log('连接失败');
    }else{
        console.log('连接成功');
    }
});
setTimeout(function(){
    mongoose.disconnect(function(){
        console.log("断开连接");
    })
}, 2000);

iOS培训,Swift培训,苹果开发培训,移动开发培训

iOS培训,Swift培训,苹果开发培训,移动开发培训

 

Schema

  Schema主要用于定义MongoDB中集合Collection里文档document的结构  

  定义Schema非常简单,指定字段名和类型即可,支持的类型包括以下8种

iOS培训,Swift培训,苹果开发培训,移动开发培训

String      字符串
Number      数字    
Date        日期
Buffer      二进制
Boolean     布尔值
Mixed       混合类型
ObjectId    对象ID    
Array       数组

iOS培训,Swift培训,苹果开发培训,移动开发培训

  通过mongoose.Schema来调用Schema,然后使用new方法来创建schema对象

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');var Schema = mongoose.Schema;var mySchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

  [注意]创建Schema对象时,声明字段类型有两种方法,一种是首字母大写的字段类型,另一种是引号包含的小写字段类型

var mySchema = new Schema({title:String, author:String});//或者 var mySchema = new Schema({title:'string', author:'string'});

  如果需要在Schema定义后添加其他字段,可以使用add()方法

var MySchema = new Schema;
MySchema.add({ name: 'string', color: 'string', price: 'number' });

  

Model

  模型Model是根据Schema编译出的构造器,或者称为类,通过Model可以实例化出文档对象document

  文档document的创建和检索都需要通过模型Model来处理

【model()】

mongoose.model()

  使用model()方法,将Schema编译为Model。model()方法的第一个参数是模型名称

  [注意]一定要将model()方法的第一个参数和其返回值设置为相同的值,否则会出现不可预知的结果

  Mongoose会将集合名称设置为模型名称的小写版。如果名称的最后一个字符是字母,则会变成复数;如果名称的最后一个字符是数字,则不变;如果模型名称为"MyModel",则集合名称为"mymodels";如果模型名称为"Model1",则集合名称为"model1"

var schema = new mongoose.Schema({ num:Number, name: String, size: String});var MyModel = mongoose.model('MyModel', schema);

【实例化文档document】

  通过对原型Model1使用new方法,实例化出文档document对象

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(err){
        console.log('连接失败');
    }else{
        console.log('连接成功');        var schema = new mongoose.Schema({ num:Number, name: String, size: String});        var MyModel = mongoose.model('MyModel', schema);        var doc1 = new MyModel({ size: 'small' });
        console.log(doc1.size);//'small'    }
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

【文档保存】

  通过new Model1()创建的文档doc1,必须通过save()方法,才能将创建的文档保存到数据库的集合中,集合名称为模型名称的小写复数版

  回调函数是可选项,第一个参数为err,第二个参数为保存的文档对象

save(function (err, doc) {})

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(!err){        var schema = new mongoose.Schema({ num:Number, name: String, size: String });        var MyModel = mongoose.model('MyModel', schema);        var doc1 = new MyModel({ size: 'small' });
        doc1.save(function (err,doc) {        //{ __v: 0, size: 'small', _id: 5970daba61162662b45a24a1 }          console.log(doc);
        })
    }
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

  由下图所示,db1数据库中的集合名称为mymodels,里面有一个{size:"small"}的文档

iOS培训,Swift培训,苹果开发培训,移动开发培训

 

自定义方法

【实例方法】

  Model的实例是document,内置实例方法有很多,如 save,可以通过Schema对象的methods属性给实例自定义扩展方法

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(!err){        var schema = new mongoose.Schema({ num:Number, name: String, size: String });        
        schema.methods.findSimilarSizes = function(cb){            return this.model('MyModel').find({size:this.size},cb);
        }        var MyModel = mongoose.model('MyModel', schema);        var doc1 = new MyModel({ name:'doc1', size: 'small' });        var doc2 = new MyModel({ name:'doc2', size: 'small' });        var doc3 = new MyModel({ name:'doc3', size: 'big' });
        doc1.save();
        doc2.save();
        doc3.save();
        setTimeout(function(){
            doc1.findSimilarSizes(function(err,docs){
                docs.forEach(function(item,index,arr){                    //doc1
                    //doc2                     console.log(item.name)        
                })
            })  
        },0)  
    }
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

【静态方法】

  通过Schema对象的statics属性给 Model 添加静态方法

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(!err){        var schema = new mongoose.Schema({ num:Number, name: String, size: String });        
        schema.statics.findByName = function(name,cb){            return this.find({name: new RegExp(name,'i')},cb);
        }        var MyModel = mongoose.model('MyModel', schema);        var doc1 = new MyModel({ name:'doc1', size: 'small' });        var doc2 = new MyModel({ name:'doc2', size: 'small' });        var doc3 = new MyModel({ name:'doc3', size: 'big' });
        doc1.save();
        doc2.save();
        doc3.save();
        setTimeout(function(){
            MyModel.findByName('doc1',function(err,docs){                //[ { _id: 5971e68f4f4216605880dca2,name: 'doc1',size: 'small',__v: 0 } ]                console.log(docs);
            })  
        },0)  
    }
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

  由上所示,实例方法和静态方法的区别在于,静态方法是通过Schema对象的statics属性model添加方法,实例方法是通过Schema对象的methods是给document添加方法

【查询方法】

  通过schema对象的query属性,给model添加查询方法

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(!err){        var schema = new mongoose.Schema({ age:Number, name: String});        
        schema.query.byName = function(name){            return this.find({name: new RegExp(name)});
        }        var temp = mongoose.model('temp', schema);   
        temp.find().byName('huo').exec(function(err,docs){            //[ { _id: 5971f93be6f98ec60e3dc86c, name: 'huochai', age: 27 },
            // { _id: 5971f93be6f98ec60e3dc86e, name: 'huo', age: 30 } ]            console.log(docs);
        })  

    }           
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

 

文档新增

  文档新增有三种方法,一种是使用上面介绍过的文档的save()方法,另一种是使用模型model的create()方法,最后一种是模型model的insertMany()方法

【save()】

  [注意]回调函数可以省略

save([options], [options.safe], [options.validateBeforeSave], [fn])

  新建{age:10,name:'save'}文档,并保存

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(!err){        var schema = new mongoose.Schema({ age:Number, name: String});        
        var temp = mongoose.model('temp', schema);        //使用链式写法    
        new temp({age:10,name:'save'}).save(function(err,doc){            //[ { _id: 59720bc0d2b1125cbcd60b3f, age: 10, name: 'save', __v: 0 } ]            console.log(doc);        
        });         
    }           
});

iOS培训,Swift培训,苹果开发培训,移动开发培训

【create()】

  使用save()方法,需要先实例化为文档,再使用save()方法保存文档。而create()方法,则直接在模型Model上操作,并且可以同时新增多个文档

Model.create(doc(s), [callback])

  新增{name:"xiaowang"},{name:"xiaoli"}这两个文档

iOS培训,Swift培训,苹果开发培训,移动开发培训

var mongoose = require('mongoose');
mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {    if(!err){        var schema = new mongoose.Schema({ age:Number, name: String});        
        var temp = mongoose.model('temp', schema);   
        temp.create({name:"xiaowang"},{name:"xiaoli"},function(err,doc1,doc2){            //{ __v: 0, name: 'xiaowang', _id: 59720d83ad8a953f5cd04664 }            console.log(doc1); 
            //{ __v: 0, name: 'xiaoli', _id: 59720d83ad8a953f5cd04665 }            console.log(doc2); 
        });       
    }           
});

iOS培训,Swift培训,苹果开发培训,移动开发培训http://www.cnblogs.com/xiaohuochai/p/7215067.html