首頁 > 易卦

Node.js教程第二十九節 使用Mongoose操作MongoDB資料庫

作者:由 向上生長向陽而生 發表于 易卦日期:2022-10-26

js怎麼獲取資料庫中的資料

Node.js教程第二十九節 使用Mongoose操作MongoDB資料庫

一、Mongoose基本概念

1、模式

每個模式對映到一個MongoDB集合,定義該集合的結構(類似於SQL資料庫的表結構)。

模式是一種以檔案形式儲存的模板,僅僅是集合的模型骨架。

2、模型

模型是基於模式定義構建的,封裝了資料屬性和行為的類。

模式是靜態的定義,必須將模式編譯為模型才能用於資料訪問。

3、例項

例項是指模型(類)的例項,類似SQL資料庫的記錄,是由模型建立的實體。

每個MongoDB文件就是一個例項,Mongoose實現了例項對MongoDB文件的一一對映。

模式和模型是定義部分,而例項是模型例項化後建立的物件,是真正要操作的物件。

二、使用Mongoose的基本步驟

1、安裝包並匯入相應模組

安裝Mongoose

cnpm install mongoose ——save

在程式中匯入該模組

const mongoose = require(‘mongoose’);

2、建立到MongoDB的連線

const mongoose = require(‘mongoose’);

mongoose。connect(‘mongodb://127。0。0。1:27017/newtest’, {useNewUrlParser: true, useUnifiedTopology: true });

const conn = mongoose。connection;

conn。on(‘error’, function(error){

console。log(‘資料庫連線失敗:’+error);

});

conn。once(‘open’, function() {

console。log(‘資料庫連線成功’);

});

3、定義模式

定義模式主要指定對應的MongoDB集合的欄位和欄位型別。

文件中每個屬性的型別會被轉換為模式定義對應的模式型別(SchemaType)。

var UserSchema = new mongoose。Schema({

name: String,

pwd: String,

age: Number,

date:{type: Date,default: Date。now }

});

可以直接宣告模式型別為某一種型別,或者使用含有type屬性的物件來宣告型別。

可以指定的其他屬性還有驗證器、索引等。

4、建立模型

建立模型是將模式編譯成模型,使用mongoose。model(modelName, schema)方法基於模式定義生成一個模型類,以對應於MongoDB集合。

const User = mongoose。model(‘User’, UserSchema);

直到模型所使用的資料庫連線開啟,集合才會被建立或刪除。

每個集合都有一個繫結的連線。如果模型是透過呼叫mongoose。model()方法生成的,它使用的是Mongoose的預設連線。

自行建立的連線需要使用連線物件的model()函式來代替mongoose。model()方法,例如:

var conn = mongoose。createConnection(‘mongodb://localhost:27017/test’);

var User = conn。model(‘User’, UserSchema);

5、例項化模型並執行資料操作

例項化模型,即建立實體。

var user = new User({

name: ‘王強’,

pwd: ‘123456’,

age:32

});

進行例項操作,呼叫save()方法在資料庫集合中存入一個文件。

//儲存資料

user。save(function(err, doc){

if (err) {

console。log(‘save error:’ + err);

}

console。log(‘save sucess \n’ + doc);

//查詢資料進行驗證

Model。find({name:‘laowang’},(err,doc)=>{

console。log(doc);

})

});

測試

Node.js教程第二十九節 使用Mongoose操作MongoDB資料庫

三、文件操作

1、建立文件

使用save()方法

var User = mongoose。model(‘User’, UserSchema);

var laoli = new User({name: ‘laoli’, pwd: ‘673456’,age: 30 });

laoli。save(function (err) {

if (err) return handleError(err);

});

改用模型的靜態方法create(),其用法如下:

Model。create(docs, [options], [callback])

示例

User。create({name: ‘laoli’, pwd: ‘673456’,age: 30 }, function (err, laoli) {

if (err) return handleError(err);

})

改用靜態方法insertMany()一次性新增多個文件,例如:

User。insertMany([{name: ‘laoli’, pwd: ‘673456’,age: 30 }], function(err) {

});

2、查詢文件

執行查詢的方式

傳入回撥函式引數,Mongoose立即執行查詢,並將查詢結果傳給回撥函式。

var User = mongoose。model(‘User’, UserSchema);

//查詢name匹配‘laoli’的文件,輸出name和age欄位

User。findOne({‘name’: ‘laoli’ },‘name age’,function(err, user){

if (err) return handleError(err);

console。log(user);

});

使用查詢構建器,不傳遞迴調函式引數,返回一個Query例項(物件)。

var query = User。findOne({ ‘name’: ‘loali’ });

query。select(‘name age’);

query。exec(function (err, user) { //執行查詢操作

if (err) return handleError(err);

console。log(user);

});

Query物件的then()方法

const q = MyModel。updateMany({}, { isDeleted: true }, function() {

console。log(‘Update 1’);

});

q。then(() => console。log(‘Update 2’));

q。then(() => console。log(‘Update 3’));

流式處理MongoDB查詢結果

var cursor = User。find({ age: 30 })。cursor();

cursor。on(‘data’, function(doc) {

// 對每個文件呼叫一次

});

cursor。on(‘close’, function() {

// 完成時呼叫

});

3、更改文件

使用findById()方法配合save()方法

User。findById(id, function (err, user) {

if (err) return handleError(err);

user。age = 30;

user。save(function (err, updatedUser) {

if (err) return handleError(err);

console。log(updatedUser);

});

});

使用模型的靜態方法update() :

User。update({ _id: id }, { $set: { age: 30 }}, callback);

靜態方法updateMany()可以修改多個文件,語法格式如下:

Model。updateMany()([conditions], [update], [options], [callback])

4、刪除文件

模型的remove()靜態方法

User。remove({ age: 32 }, function (err) {

if (err) return handleError(err);

});

5、覆蓋文件

用set()方法覆蓋整個文件

User。findById(id, function (err, user) {

if (err) return handleError(err);

// ‘otherUser’成為‘user’的複製

otherUser。set(user);

});

6、自定義文件操作方法

自定義例項方法

var animalSchema = new Schema({ //定義關於動物的模式

name: String, type: String

});

animalSchema。methods。findSimilarTypes = function (cb) {//為例項定義查詢型別相同的方法

return this。model(‘Animal’)。find({ type: this。type }, cb);

}

所有的animalSchema例項都可使用findSimilarTypes()方法

var AnimalModel = mongoose。model(‘Animal’, animalSechema);//建立模型

var dog = new AnimalModel({ type: ‘狗狗’ }); //例項化模型

dog。findSimilarTypes(function (err, dogs) { //例項呼叫findSimilarTypes()方法

console。log(dogs);

});

自定義模型靜態方法

animalSchema。statics。findByName = function (name, cb) { //宣告按名查詢的靜態方法

this。find({ name: new RegExp(name, ‘i’) }, cb);

}

使用findByName ()靜態方法:

var AnimalModel = mongoose。model(‘Animal’, animalSchema); //建立模型

AnimalModel。findByName(‘海豚’, function (err, animals) { //模型呼叫靜態方法

console。log(animals);

});

四、資料驗證

1、內建的驗證器

var breakfastSchema = new Schema({ //定義一個關於早餐的模式

eggs: {

type: Number,

min: [6, ‘雞蛋太少’], //最小值驗證,低於6將報出‘雞蛋太少’訊息

max: 12 //最大值驗證

},

bacon: {

type: Number,

required: [true, ‘為何沒有鹹肉?’] //必需欄位,提供驗證的錯誤資訊

},

drink: {

type: String,

enum: [‘咖啡’, ‘茶’], //列舉範圍

required: function() {

return this。bacon > 3; //定製返回值(根據bacon的數量)確定是否必需欄位 }

}

});

2、自定義驗證器

var userSchema = new Schema({ //定義一個關於使用者的模式

phone: {

type: String,

validate: { //自定義驗證器檢查電話號碼

validator: function(v) {

return /\d{3}-\d{3}-\d{4}/。test(v);

},

message: props => ‘${props。value} 不是有效的電話號碼!’

},

required: [true, ‘要求提供使用者的電話號碼’]

}

});

3、驗證錯誤資訊

var toySchema = new Schema({ //定義一個關於玩具的模式

color: String,

name: String

});

var validator = function(value) { //定義一個玩具顏色的驗證器函式

return /red|white|gold/i。test(value);

};

//引用驗證器函式檢查玩具顏色

toySchema。path(‘color’)。validate(validator,‘顏色 ’{VALUE}‘ 是無效的’, ‘無效顏色’);

toySchema。path(‘name’)。validate(function(v) { //匿名的驗證器函式用於檢查玩具品名

if (v !== ‘Turbo Man’) {

throw new Error(‘需要的是奧特曼’);

}

return true;

}, ‘品名 ’{VALUE}‘ 不合格’);