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方法

相關文章
相關標籤/搜索