1. 程式人生 > 遊戲攻略 >《戰神4》全文物位置與收集指南 魔法的臉面、棄船文物位置介紹

《戰神4》全文物位置與收集指南 魔法的臉面、棄船文物位置介紹

1. 資料庫概述及環境搭建 | 2. 基於mongoose對MongoDB增刪改查操作 | 3. mongoDB資料庫新增賬號

@

目錄

一、資料庫概述及環境搭建

1.概述

為什麼要使用資料庫

  • 動態網站中的資料都是儲存在資料庫中的
  • 資料庫可以用來持久儲存客戶端通過表單收集的使用者資訊
  • 資料庫軟體本身可以對資料進行高效的管理

什麼是資料庫

資料庫即儲存資料的倉庫,可以將資料進行有序的分門別類的儲存。它是獨立於語言之外的軟體,可以通過API去操作它。
常見的資料庫軟體有:mysql、mongoDB、oracle。




2. MongoDB環境搭建

MongoDB官方中文文件
下載地址

MongoDB視覺化軟體

MongoDB視覺化操作軟體,是使用圖形介面操作資料庫的一種方式。


資料庫相關概念

在一個數據庫軟體中可以包含多個數據倉庫,在每個資料倉庫中可以包含多個數據集合,每個資料集合中可以包含多條文件(具體的資料)。

術語 解釋說明
database 資料庫,mongoDB資料庫軟體中可以建立多個數據庫
collection 集合,一組資料的集合,可以理解為JavaScript中的陣列
document 文件,一條具體的資料,可以理解為JavaScript中的物件
field 欄位,文件中的屬性名稱,可以理解為JavaScript中的物件屬性

啟動與停止MongoDB

以管理員身份在命令列工具中執行
net start mongoDB即可啟動MongoDB,否則MongoDB將無法連線。
net stop mongoDB即可停止MongoDB服務。


Mongoose第三方包

使用Node.js操作MongoDB資料庫需要依賴Node.js第三方包mongoose
使用npm install mongoose命令下載之後用require('mongoose')引入
Mongoose-npm
Mongoose 5.0 中文文件

資料庫連線

使用mongoose提供的connect方法即可連線資料庫

const mongoose = require('mongoose');
//連結playground資料庫的之前自動建立該資料庫
mongoose.connect('mongodb://localhost/playground', {useNewUrlParser: true})
//connect方法方法返回Promise物件, 內部輸出結果可用then()或catch()接收
.then(() => console.log('資料庫連線成功'))
.catch(err => console.log('資料庫連線失敗', err));

建立資料庫

在MongoDB中不需要顯式建立資料庫,如果正在使用的資料庫不存在,MongoDB會自動建立。




二、基於mongoose對MongoDB增刪改查操作

1. 建立集合

mongoose.Schema() / mongoose.model()

建立集合分為兩步:

  1. 對對集合設定規則,建立mongoose.Schema建構函式的例項即可建立集合規則
    let SchemaName = new mongoose.Schema({
    //欄位規則...
    })
    
  2. 建立集合,通過mongoose.model()方法建立集合並應用指定的集合規則
    /*注意:集合名稱需首字母大寫,比如: Course; mongodb資料庫建立的集合名為: courses
    方法返回一個集合建構函式
    */
    let collection = mongoose.model(集合名稱,集合規則);
    


2. 建立文件

方式一:save()

分為兩步:
① 通過所建立的集合建構函式建立文件並插入該集合中。
② 呼叫例項物件下的save()將資料儲存到資料庫中。

方式二: collection.create()

/*
err: 文件插入失敗,返回錯誤資訊物件,否者返回null
doc: 文件插入成功, 文件本身
*/
create({被插入文件資料物件},callback(err, doc) =>{
})
// 引入mongoose第三方模組 用來操作資料庫
//const mongoose = require('mongoose');
// 資料庫連線
//mongoose.connect(//...);

// 建立集合規則
const courseSchema = new mongoose.Schema({
	name: String,
	author: String,
	isPublished: Boolean
});

// 使用規則建立集合
const Course = mongoose.model('Course', courseSchema) // 資料庫實際生成集合名: courses

// 方式一:
// 建立文件
const course = new Course({
	name: 'node.js基礎',
	author: 'teacher',
	isPublished: true,
	//通過給欄位設定 unique: true 來使在插入欄位時資料庫會檢測該欄位的值是否重複了之前插入的欄位值,如果重複,報錯
	unique: true
});
// 將文件插入到資料庫中
course.save();

//方式二:
Course.create({name: 'JavaScript', author: 'MrLi', isPublish: true}, (err, doc) => {
// 錯誤物件
console.log(err)
// 當前插入的文件
console.log(doc)
});
//注意:mongodb大部分API都是非同步,create()是非同步API,可返回Promise物件
Course.create({name:'JavaScript',author: 'MrLi', isPublish: true})
	.then(doc => {console.log(doc)})
	.catch(err => {console.log(err)})


3. mongoDB資料庫匯入資料

通過命令mongoimport -d 資料庫名稱 -c 集合名稱 --file 要匯入的資料檔案 匯入資料
找到mongodb資料庫的安裝目錄,將安裝目錄下的bin目錄放置在環境變數path中。

PS D:\...\test\item> mongoimport -d playground -c users --file ./user.json
2021-08-30T17:18:19.562+0800    connected to: localhost
2021-08-30T17:18:19.644+0800    imported 6 documents
PS D:\...test\item>


4. 查詢文件

collection.find()

// 根據條件查詢文件(條件為空則查詢所有文件)
Course.find({//查詢條件
})
//find()返回Promise物件
.then(result => console.log(result))
/*
find()返回文件集合(陣列) , 
若擦找不到返回空陣列
比如:
*/
[{
	_id: 5c0917ed37ec9b03c07cf95f,
	name: 'node.js基礎',
	author: 'teacher‘
},{
	_id: 5c09dea28acfb814980ff827,
	name: 'Javascript',
	author: 'MrLi'
}]

collection.findone()

// 根據條件查詢文件(條件為空則查詢集合的首個文件)
Course.findOne({name: 'node.js基礎'}).then(result => console.log(result))
// 返回文件(物件)
{
	_id: 5c0917ed37ec9b03c07cf95f,
	name: 'node.js基礎',
	author: 'teacher'
}

指定特殊條件查詢文件

// 匹配指定欄位值大於($gt) 小於($lt)
User.find({age: {$gt: 20, $lt: 50}}).then(result => console.log(result))

// 匹配指定欄位值包含($in)
User.find({hobbies: {$in: ['敲程式碼']}}).then(result => console.log(result))

// 選擇要查詢的欄位, -欄位名:表示不查詢此欄位
User.find().select('name email').then(result => console.log(result))

// 將資料按照年齡進行排序(預設升序), -欄位名錶示降序
User.find().sort('age').then(result => console.log(result))

// skip 跳過多少條資料 limit 限制查詢數量
User.find().skip(2).limit(2).then(result => console.log(result))

collection.countDocuments()

返回集合裡的所用文件一共的數量,方法返回promise物件

user.countDocuments(查詢條件)

Model.countDocuments()



5. 刪除文件

collection.findOneAndDelete()

/*
刪除單個文件, 可通過指定引數物件來刪除指定文件
如何查詢條件匹配了多個文件, 那麼將會刪除第一個匹配的文件
返回刪除的文件
*/
Course.findOneAndDelete({}).then(result => console.log(result))

collection.deleteMany()

/*
刪除多個文件
當不指定引數,將會刪除集合裡的所有文件
返回一個物件{ deletedCount }, 被刪除文件的數量
*/
User.deleteMany({}).then(result => console.log(result))


6. 更新文件

collection.updateOne()

// // 更新單個
User.updateOne({查詢條件}, {要修改的值}).then(result => console.log(result))

collection.updateMany()

//// 更新多個
User.updateMany({查詢條件}, {要更改的值}).then(result => console.log(result))

< BR > < BR >

7. mongoose驗證

在建立集合規則時,可以設定當前欄位的驗證規則,驗證失敗就則輸入插入失敗。

一般驗證項

驗證項 說明 eg
required 設定欄位為必傳欄位 required: true
minlength 設定字串欄位最小長度 minlength:3
maxlength 設定字串欄位最大長度 maxlength: 20
min 設定數值欄位最小值 min: 2
max 設定數值欄位最大值 max: 100
enum 設定欄位的預選值(只能時預選值) enum: ['html', 'css', 'javascript', 'node.js']
trim 去除字串欄位兩邊的空格 trim: true
default 設定插入文件時欄位的預設值 預設值

可自定義錯誤資訊,比如驗證項: [值,'自定義錯誤資訊']

自定義驗證器

特殊驗證項 : validate

new mongoose.Schema({
	title: {
		// 指定欄位型別
		type: String,
		// 必選欄位
		required: [true, '請傳入文章標題'],
		// 字串的最小長度
		minlength: [2, '文章長度不能小於2'],
		// 字串的最大長度
		maxlength: [5, '文章長度最大不能超過5'],
		// 去除字串兩邊的空格
		trim: true
	},
	age: {
		type: Number,
		// 數字的最小範圍
		min: 18,
		// 數字的最大範圍
		max: 100
	},
	publishDate: {
		type: Date,
		// 預設值
		default: Date.now
	},
	category: {
		type: String,
		// 列舉 列舉出當前欄位可以擁有的值
		enum: {
			values: ['html', 'css', 'javascript', 'node.js'],
			message: '分類名稱要在一定的範圍內才可以'
		}
	},
	author: {
		type: String,
		validate: {
			//自定義驗證規則
			validator: v => {
				// 返回布林值
				// true 驗證成功
				// false 驗證失敗
				// v 要驗證的值
				return v && v.length > 4
			},
			// 自定義錯誤資訊
			message: '傳入的值不符合驗證規則'
		}
	}
});


Post.create({title:'aa', age: 60, category: 'java', author: 'bd'})
	.then(result => console.log(result))
	.catch(error => {
		// 獲取錯誤資訊物件
		const err = error.errors;
		// 迴圈錯誤資訊物件
		for (var attr in err) {
			// 將錯誤資訊列印到控制檯中
			console.log(err[attr]['message']);
		}
	})

獲取錯誤資訊

error.errors['欄位名稱'].message



8. 集合關聯

通常不同集合的資料之間是有關係的,例如文章資訊和使用者資訊儲存在不同集合中,但文章是某個使用者發表的,要查詢文章的所有資訊包括髮表使用者,就需要用到集合關聯

比如:
使用id對集合進行關聯
使用populate方法進行關聯集合查詢

// 引入mongoose第三方模組 用來操作資料庫
//const mongoose = require('mongoose');
// 資料庫連線
//mongoose.connect(//...)
// 使用者集合
const User = mongoose.model('User', new mongoose.Schema({
	name: {
		type: String,
		required: true
	}
}););
// 文章集合
const Post = mongoose.model('Post', new mongoose.Schema({
	title: {
		type: String
	},
	author: {
		//通過以下方式:autor欄位關聯到 users集合 中的文件
		type: mongoose.Schema.Types.ObjectId,
		ref: 'User'
	}
}););
User.create({name: 'gh'}).then(result => console.log(result));
Post.create({titile: '123', author: '5c0caae2c4e4081c28439791'}).then(result => console.log(result));
//通過populate()查詢 posts集合中文件中的 關聯欄位author
Post.find().populate('author').then(result => console.log(result))



三、mongoDB資料庫新增賬號

  1. 以系統管理員的方式執行powershell

  2. 連線資料庫 mongo

  3. 檢視資料庫 show dbs

  4. 切換到預設資料庫admin, use admin

  5. 建立超級管理員賬戶

    /*
    建立賬號 
    user: 使用者名稱 
    pwd: 密碼
    roles:角色,可指定多個角色,
    	root:超級管理員
    	readWirte: 讀寫許可權
    */
    db.createUser({user:'root', pwd:'root',roles:['root']})
    
  6. 登入超級管理員賬戶 db.auth('超級管理員使用者名稱', '超級管理員使用者名稱密碼')

  7. 切換到自定義資料庫(自建)

    比如,登入超級管理員賬戶後,使用一個名為blog的資料庫,mongoDB會自動判斷當前資料庫是否存在,
    如果不存在會自動建立		
    use blog
    
  8. 建立普通賬號 db.createUser()

    db.createUser({user:'blog', pwd:'blog',roles:['readWrite']})
    
  9. 解除安裝mongodb服務

    • 停止服務 net stop mongodb
    • mongod --remove
  10. 建立mongodb服務

    /*
    --logpath: 指定輸出日誌目錄
    --dbpath: 指定資料庫的儲存目錄
    --install: 安裝mongoDB服務
    -auth: 設定資料庫必須登入才能操作
    */
    mongod --logpath="C:\Program Files\MongoDB\Server\4.1\log\mongod.log" --dbpath="C:\ProgramFiles\MongoDB\Server\4.1\data" --install –-auth
    
  11. 在專案中使用賬號連線資料庫

    /*
    user: 使用者名稱
    pass: 密碼
    預設埠: 27017
    */
    mongoose.connect('mongodb://user:pass@localhost:27017/database')
    

    如果不連線就訪問資料庫則會報錯 MongoError

    (node:4088) UnhandledPromiseRejectionWarning: MongoError: command find requires authentication