1. 程式人生 > >MongoDB學習筆記之Mongoose的使用

MongoDB學習筆記之Mongoose的使用

MongoDB的介紹

在說MongoDB資料插入操作之前,我們先來簡單瞭解下它的資料邏輯結構。
MongoDB的邏輯結構是一種層次結構,主要由:文件(document)、集合(collection)、資料庫(database)這三部分組成的。
文件(document):由鍵/值對構成,像{a:1};{s:”abc”}等,它是MongoDB核心單元,MongoDB的文件(document),相當於關係資料庫中的一行記錄。
集合(Collection):多個文件組成一個集合(collection),相當於關係資料庫的表。
資料庫(database):多個集合(collection),邏輯上組織在一起,就是資料庫(database)。

一個MongoDB例項支援多個數據庫(database)。

安裝及引用

安裝

npm install mongoose

引用mongoose

var mongoose = require(“mongoose”);

使用mongoose連結資料庫

var db = mongoose(“mongodb://user:[email protected]:port/database”);

示例

var mongoose = require(“mongoose”);
var db = mongoose.connect(“mongodb://127.0.0.1:27017/test”);
db.connection.on(“error”, function (error) {
console.log(“資料庫連線失敗:” + error);
});
db.connection.on(“open”, function () {
console.log(“——資料庫連線成功!——”);
});

MongoDB基礎

Schema : 一種以檔案形式儲存的資料庫模型骨架,不具備資料庫的操作能力

Model : 由Schema釋出生成的模型,具有抽象屬性和行為的資料庫操作對

Entity : 由Model建立的實體,他的操作也會影響資料庫

Schema
Schema —— 一種以檔案形式儲存的資料庫模型骨架,無法直接通往資料庫端,也就是說它不具備對資料庫的操作能力,僅僅只是資料庫模型在程式片段中的一種表現,可以說是資料屬性模型(傳統意義的表結構),又或著是“集合”的模型骨架。
定義

var mongoose = require("mongoose")
var
TestSchema = new mongoose.Schema({ name : {type:String}, age : {type:Number,default:0}, time : {type:Date,default:Date.now}, emial : {type:String,default:''} });

基本屬性型別有:字串、日期型、數值型、布林型(Boolean)、null、陣列、內嵌文件等

Model
Model —— 由Schema構造生成的模型,除了Schema定義的資料庫骨架以外,還具有資料庫操作的行為,類似於管理資料庫屬性、行為的類。

var db = mongoose.connect("mongodb://127.0.0.1:27017/test");
// 通過Schema建立Model
var TestModel = db.model("test1", TestSchema);

資料庫中的集合名稱,當我們對其新增資料時如果test1已經存在,則會儲存到其目錄下,如果未存在,則會建立test1集合,然後在儲存資料。

Entity
Entity —— 由Model建立的實體,使用save方法儲存資料,Model和Entity都有能影響資料庫的操作,但Model比Entity更具操作性。

var TestEntity = new TestModel({
    name : "Lenka",
    age : 36,
    email : "[email protected]"
});
console.log(TestEntity.name); // Lenka
console.log(TestEntity.age); // 36

示例1

資料庫的連線,Schemal的建立,模型的建立,實體的建立,通過實體儲存資料庫資訊。

var mongoose = require("mongoose");
var db = mongoose.connect("mongodb://127.0.0.1:27017/test");
var TestSchema = new mongoose.Schema({
    name : {type:String},
    age : {type:Number,default:0},
    email : {type:String},
    time : {type:Date,default:Date.now}
});
var TestModel = db.model("test1",TestSchema); //'test'相當於collection
var TestEntity = new TestModel({
    name:'helloworld',
    age:28,
    emial:'[email protected]'
});
TestEntity.save(function(err,doc){
    if(err){
        console.log("error :" + err);
    } else {
        console.log(doc);
    }
});

這裡寫圖片描述

可以看到資料庫新增記錄成功

示例2

通過entity、model來完成資料庫的增刪查改。
// mongoose 連結

var mongoose = require('mongoose');
var db       = mongoose.createConnection('mongodb://127.0.0.1:27017/test'); 

Schema 結構

var mongooseSchema = new mongoose.Schema({
    username : {type : String, default : '匿名使用者'},
    title    : {type : String},
    content  : {type : String},
    time     : {type : Date, default: Date.now},
    age      : {type : Number}
});
// 新增 mongoose 例項方法
mongooseSchema.methods.findbyusername = function(username, callback) {
    return this.model('mongoose').find({username: username}, callback);
}
// 新增 mongoose 靜態方法,靜態方法在Model層就能使用
mongooseSchema.statics.findbytitle = function(title, callback) {
    return this.model('mongoose').find({title: title}, callback);
}

相當於Schemal是一個建構函式,在這裡可以新增方法findbyuseraname()和findbytitle

model結構

var mongooseModel = db.model('mongoose', mongooseSchema);

我理解為在test資料庫下面建立了mongoose collection的連線

Entity結構

//增加操作
var doc = {username : 'emtity_demo_username', title : 'emtity_demo_title', content : 'emtity_demo_content'};
var mongooseEntity = new mongooseModel(doc);
mongooseEntity.save(function(error) {
    if(error) {
        console.log(error);
    } else {
        console.log('saved OK!');
    }
    // 關閉資料庫連結
    db.close();
});
//查詢操作
var mongooseEntity = new mongooseModel({});
mongooseEntity.findbyusername('model_demo_username', function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //關閉資料庫連結
    db.close();
});

基於model的增加、修改與查詢

// 增加記錄 基於model操作
var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'};
mongooseModel.create(doc, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('save ok');
    }
    // 關閉資料庫連結
    db.close();
});
//修改記錄
//mongooseModel.update(conditions, update, options, callback);
var conditions = {username : 'model_demo_username'};
var update     = {$set : {age : 27, title : 'model_demo_title_update'}};
var options    = {upsert : true};
mongooseModel.update(conditions, update, options, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('update ok!');
    }
    //關閉資料庫連結
    db.close();
});
// mongoose find
var criteria = {title : 'emtity_demo_title'}; // 查詢條件
var fields   = {title : 1, content : 1, time : 1}; // 待返回的欄位
var options  = {};
mongooseModel.find(criteria, fields, options, function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //關閉資料庫連結
    db.close();
});
// 刪除記錄
var conditions = {username: 'emtity_demo_username'};
mongooseModel.remove(conditions, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('delete ok!');
    }

    //關閉資料庫連結
    db.close();
});

基於例項方法的查詢

前面說到findbyusername()在schemal層定義,相當於例項化,然後繼承findbyusername()方法

var mongooseEntity = new mongooseModel({});
mongooseEntity.findbyusername('model_demo_username', function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //關閉資料庫連結
    db.close();
});

基於靜態方法的查詢

靜態方法可以直接在模型層呼叫

// 基於靜態方法的查詢
mongooseModel.findbytitle('emtity_demo_title', function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //關閉資料庫連結
    db.close();
});

本文也是研究了好幾篇博文而來的心得體會,mongoose裡面其實就三個概念,schemal、model、entity,把這三個弄清楚了也就好了。