一篇文章入門Mongoose

Mongoose入門

01 mongoose的好處

  • 能夠爲文檔建立一個模式結構 (Schema)
  • 能夠對模型種的對象/文檔進行驗證
  • 數據能夠經過類型轉換爲對象模型
  • 可使用中間件來應用業務邏輯掛鉤
  • 比Node原生的MongoDB驅動更容易

02 mongoose中的新對象

  • Schema(模式對象)
    • Schema對象定義約束了數據庫中的文檔結構
  • Model
    • Model對象做爲集合中的全部文檔的表示,至關於MongoDB數據庫中的集合collection
  • Document
    • Document表示集合中的具體文檔,至關於集合中的一個具體的文檔

03實例

/* 1.下載安裝mongoose npm i mongoose --save 2.引入數據庫 var mongoose = require("mongoose"); 3.鏈接數據庫 mongoose.connect("mongodb://localhost/test",{useMongoClient:true}); mongoose.connect("mongodb://數據庫的ip:端口號/數據庫名",{useMongoClient:true}) 新版中{useMongoClient:true}不用再寫了 端口號默認是27017則能夠省略 4.監聽數據庫鏈接狀態 在mongoose對象中,有一個屬性是connection,該對象表示的就是數據庫鏈接 經過監視該對象的狀態,能夠來監聽數據庫的鏈接與斷開 數據庫鏈接成功的事件 mongoose.connection.once("open",fn); 數據庫斷開的事件 mongoose.connection.once("close",fn); 5.斷開數據庫鏈接 mongoose.disconnect(); */
複製代碼

04 Schema

var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/test",{useMongoClient:true});
mongoose.connection.once("open",function(){
    console.log("數據庫鏈接成功!");
})

//建立約束模式

//將mongooose.Schema賦值給一個變量
var Schema = mongoose.Schema;

//建立Schema(模式)對象
var stuSchema = new Schema({
    name:String;
    age:Number;
    gender:{
    	type:String,
    	default:"female"
	},
    address:String;
})

//建立model,代指集合

//經過Schema來建立Model
// Model表明的是數據庫中的集合,經過Model才能對數據庫進行操做
// mongoose.model(modelName,Schema)
// modelName 就是要映射的集合名
var stuModel = mongoose.model("students",stuSchema);

//建立文檔
// stuModel.create(doc,fn(err){})
stuModel.create({
    name:"胡志武",
    age:21,
    address:"廣州"
},function(err){
    if(!err){
        console.log("建立文檔成功")
    }
})
複製代碼

05 Model

有了Model,咱們就能夠來對數據庫進行增刪改查的操做了javascript

  • Model.create(doc(s),[callback])
    • 用來建立一個文檔或多個文檔並添加到數據庫中
    • 參數
      • doc(s)能夠是一個文檔對象,也能夠是一個文檔對象的數組
      • callback

查詢java

  • Model.find(conditions,[projection],[options],[callback])mongodb

    • 查詢符合條件的文檔
    • 總會返回一個數組
  • Model.findOne([conditions],[projection],[options],[callback])數據庫

    • 查詢符合條件的第一個文檔
    • 返回第一個具體的文檔對象
  • Model.findById(id,[projection],[options],[callback])npm

    • 根據文檔的id屬性查詢文檔

    conditions 查詢的條件數組

    projection 投影 須要獲取的字段,mongoose

    • 兩種方式:
      • {name:1,id:0}
      • "name -id"

    options 查詢選項(skip limit)函數

    callback 回調函數,查詢結果會經過回調函數返回ui

stuModel.find({name:"胡志武"},function(err,docs){
    if(!err){
		console.log(docs);
    }
})
stuModel.find({},"name -id",function(err,docs){
    if(!err){
        console.log(docs);
    }
})
stuModel.find({},"name -id",{skip:3},function(err,docs){
    if(!err){
        console.log(docs);
    }
})
複製代碼

修改spa

Model.update(conditions,doc,[options],[callback])

Model.updateOne(conditions,doc,[options],[callback])

Model.updateMany(conditions,doc,[options],[callback])

  • 用來修改一個或多個文檔
  • 參數
    • conditions 查詢條件
    • doc 修改後的對象
    • options 配置參數
    • callback 回調函數
stuModel.update({name:"胡志武"},{$set:{age:20}},function(err){
    if(!err){
        console.log("修改爲功");
    }
})
複製代碼

刪除

Model.remove(conditions,[callback]);

Model.deleteOne(conditions,[callback]);

Model.delete(conditions,[callback]);

Model.remove({name:"胡志武"},function(err){
    console.log("刪除成功!");
})
複製代碼

文檔的數量

Model.count(conditions,[callback])

stuModel.count({age:18},function(err,count){
    console.log(count);
})
複製代碼

06 Document

Document 和 集合中的文檔一一對應,Document是Model的實例

經過Model查詢到結果都是Document

建立一個Document

var stu = new StuModel({
    name:"奔波霸",
    age:48,
    gender:"male",
    address"碧波譚"
})
// 此時尚未插入數據庫中

/* document的方法 Model#save([option],[callback]) */
stu.save(function(err){
    console.log("保存成功")
})
/* doc.update(update,[options],[callback] ) - 修改對象 doc.remove([callback]) - 刪除文檔 doc.get(name)===doc[name] doc.set(name,value)===doc[name]=value doc._id doc.toObject 轉化爲JS對象 轉化爲js對象才能刪除其中一個屬性 但轉化後document的方法都不能使用了 */
複製代碼

07 Mongoose關聯表的操做

分兩步走:

1.創建約束模型式,指定關聯字段

var mongoose = require("mongoose")
var Schema = mongoose.Schema;
var article = new Schema({
      //關聯字段 - 內容分類的id
    category: {
        //類型
        type: mongoose.Schema.Types.ObjectId,
        //引用
        ref: 'Category'//數據庫中集合的名字
    },
})
複製代碼

ref表示要關聯的集合名字,type表示經過ObjectId關聯該集合

2.關聯查詢表時,使用populate

Query.populate(path, [select], [model], [match],[options])
複製代碼

path:你要查詢的集合名

model:類型Model,指定要關聯字段的model,沒有指定的話,就會使用ref指定的

match:查詢條件

options:查詢參數,如limit,skip等

實例

content.findOne()
    .populate({path:['user','catagory']})
    .exec(function(err,data){
    
})
複製代碼

08Mongoose支持Promise,避免回調地獄

content.find()
		.count()
    	.then(function(data){
		return content.find().skip(data/2).limit(10)
	}).then(function(data){
		console.log(data)
	})
複製代碼

結語

若有錯漏處,還請看官們多多指正,若是以爲這篇文章對你有幫助的話,歡迎點贊分享!

若是要轉載,請註明出處

本文做者:胡志武

時間:2019/5/29

相關文章
相關標籤/搜索