mogoose小记

mogoosephp

schema---模式定义,堆数据库字段的类型进行定义【string,int,float】mysql

var mongoose = require('mongoose'); // 顶会议用户组件
// 建立模型
var Schema = mongoose.Schema;
var userScheMa = new Schema({
   userid: String,
   password: String
});

Model---编译模型sql

经过模式构造而来mongodb

Document---文档实例化数据库

Mongoose中的操做流程

1. 链接数据库异步

var mongoose = require("mongoose");

// 链接字符串格式为mongodb://主机/数据库名
mongoose.connect('mongodb://localhost/test');

 

2. 存储数据mongoose

var Schema = mongoose.Schema;
//骨架模版
var movieSchema = new Schema({
    doctor   : String,
    title    : String,
    language : String,
    country  : String,
    year     : Number,
    summary  : String,
    poster   : String,
    flash    : String
})
//模型
var Movie = mongoose.model('Movie', movieSchema);
//存储数据
var moive = new Movie({
    title: '黑衣人三',
    doctor: '史密斯',
    year: 2018,
    flash: 'http://player.youku.com/player.php/sid/XNjA1Njc0NTUy/v.swf',
    country: '美国',
    language: '英语',
    summary: '好片'
})
//保存数据库
moive.save(function(err) {
    if (err) {
        console.log('保存失败')
        return;
    }
    console.log('meow');
});

以上是最简单的数据操做了post

流程就是:经过Schema建立一个模式movieSchema ,经过模式movieSchema建立一个模型Movie,经过模型Movie写入数据,经过save方法保存性能

定义schema->建立model->实例化方法ui

表 –》 合集 –》 文档

这里涉及几个名词概念Schema与Model

3.Schema与Model

  • Schema : 一种以文件形式存储的数据库模型骨架,不具有数据库的操做能力
  • Model : 由Schema发布生成的模型,具备抽象属性和行为的数据库操做对

虽然模式(Schema)在MongoDB的存储中并非必须的,可是通常来讲为了文档的整齐一致咱们在Mongoose中仍是会用到模式。能够说,Mongoose中的一切都从定义模式开

不像传统的关系型数据库同样,好比mysql,链接好数据后直接有把sql语句丢到一个指定的方法中就执行了,这里会有Schema的抽象概念

Schema它相似于关系数据库的表结构,能够理解为数据库模型骨架

Schema能够看做工厂中模具同样,比如一个茶杯,喝水是茶杯最终的功能,茶杯自己就像是Model,那么茶杯的批量生产是须要靠工厂的模具成型的,这就像是Schema了

Schema不只定义了文档结构和使用性能,还能够有扩展插件、实例方法、静态方法、复合索引、文档生命周期钩子

Schema生成Model

4. CURD操做

Model能够看到关系型数据库中的表,那么经过new Model出来的实例document文档对应的则是关系数据库中表的一行记录

document有许多内置的实例方法. 能够直接执行增删改查操做

增长数据

//模型var Movie = mongoose.model('Movie', movieSchema);
var moive = new Movie({
    title: '黑衣人三',
    doctor: '史密斯',
    year: 2018,
    flash: 'http://player.youku.com/player.php/sid/XNjA1Njc0NTUy/v.swf',
    country: '美国',
    language: '英语',
    summary: '好片'
})
//保存数据库
moive.save(function(err) {
    if (err) {
        console.log('保存失败')
        return;
    }
    console.log('meow');
});

在这里咱们经过对模型Movie实例化生成了一个叫moive的文档,并使用save方法将它存储到了集合

修改数据

User.update({_id: oneUser._id}, {
    $set: {name: oneUser.name,password:oneUser.password}
}, function(err) {
    if(err){
        console.log(err)
        return
    }
    console.log('更新成功')
});

更新的数据比较少用$set,可用性仍是很好

删除数据

User.remove({
    _id: id
}, function(err) {
    if (err) {
        console.log(err)
        return
    }
    console.log('删除成功')
});

3. Documents

  Document是与MongoDB文档一一对应的模型,Document可等同于Entity,具备属性和操做性

注意:

  Document的`CRUD都必须通过严格验证的,参看2.5.2 Schema的strict严格配置

3.1 查询

  查询内容过多,专题讲解

3.2 更新

  有许多方式来更新文件,如下是经常使用的传统方式:

PersonModel.findById(id,function(err,person){
      person.name = 'MDragon';
      person.save(function(err){});
    });

  这里,利用Model模型查询到了person对象,该对象属于Entity,能够有save操做,若是使用Model`操做,需注意:

PersonModel.findById(id,function(err,person){
      person.name = 'MDragon';
      var _id = person._id; //须要取出主键_id
      delete person._id;    //再将其删除
      PersonModel.update({_id:_id},person,function(err){});
      //此时才能用Model操做,不然报错
    });

  update第一个参数是查询条件,第二个参数是更新的对象,但不能更新主键,这就是为何要删除主键的缘由。

  固然这样的更新很麻烦,可使用$set属性来配置,这样也不用先查询,若是更新的数据比较少,可用性仍是很好的:

PersonModel.update({_id:_id},{$set:{name:'MDragon'}},function(err){});

  须要注意,DocumentCRUD操做都是异步执行,callback第一个参数必须是err,而第二个参数各个方法不同,updatecallback第二个参数是更新的数量,若是要返回更新后的对象,则要使用以下方法

Person.findByIdAndUpdate(_id,{$set:{name:'MDragon'}},function(err,person){
      console.log(person.name); //MDragon
    });

  相似的方法还有findByIdAndRemove,如同名字,只能根据id查询并做update/remove操做,操做的数据仅一条

3.3 新增

  若是是Entity,使用save方法,若是是Model,使用create方法

//使用Entity来增长一条数据
    var krouky = new PersonModel({name:'krouky'});
    krouky.save(callback);
    //使用Model来增长一条数据
    var MDragon = {name:'MDragon'};
    PersonModel.create(MDragon,callback);

  两种新增方法区别在于,若是使用Model新增时,传入的对象只能是纯净的JSON对象,不能是由Model建立的实体,缘由是:由Model建立的实体krouky虽然打印是只有{name:'krouky'},可是krouky属于Entity,包含有Schema属性和Model数据库行为模型。若是是使用Model建立的对象,传入时必定会将隐藏属性也存入数据库,虽然3.x追加了默认严格属性,但也没必要要增长操做的报错

3.4 删除

  和新增同样,删除也有2种方式,但EntityModel都使用remove方法

相关文章
相关标签/搜索