js怎麼獲取資料庫中的資料
一、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);
})
});
測試
三、文件操作
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}‘ 不合格’);