尚矽谷MongoDB學習筆記
視訊連線:
筆記:
MongoDB
1.Database
-
資料庫分類
- 關係型資料庫(RDBMS)
- MySQL, Oracle, DB2, SQL Server…
- 該資料庫中全都是表
- 非關係型資料庫(No SQL)
- MongoDB, Redis…
- 鍵值對資料庫
- 文件資料庫MongoDB
- 關係型資料庫(RDBMS)
-
MongoDB是為快速開發網際網路web應用而設計的資料庫系統
-
MongoDB的資料模型時面向文件的(BSON)
2.MongoDB
2.1.安裝MongoDB
-
安裝
-
配置環境
-
在c盤根目錄建立data資料夾,在data中建立資料夾db
-
執行mongodb
- cmd:mongod //啟動mongodb伺服器,不要關閉
- 另一個cmd:mongo //連線mongodb,出現>
-
如果想更改檔案目錄(不在c盤下,但仍需data+db)
- mongod --dbpath 檔案路徑\data\db [–port 123 //更改埠]
-
database
- 伺服器:
- 伺服器用來儲存資料
- mongod 用來啟動伺服器
- 客戶端:
- 客戶端用來操作伺服器,對資料進行增刪查改的操作
- mongo 用來啟動客戶端
- 伺服器:
-
將mongodb設定為系統服務,可以自動在後臺啟動,不需要每次都手動啟動
-
在C盤根目錄建立目錄data
- mkdir c:\data\db
- mkdir c:\data\log
-
建立配置檔案
- 在bin同目錄下新增一個配置檔案 mongod.cfg
-
以管理員身份執行cmd
-
執行如下命令
-
sc.exe create MongoDB binPath="\"D:\MongoDB\Server\4.0\bin\mongod.exe\" --service --config=\"D:\MongoDB\Server\4.0\mongod.cfg\"" DisplayName="MongoDB" start="auto"
-
-
-
啟動mongodb服務
-
如果啟動失敗,證明操作有誤
- 在控制檯輸入 sc delete MongoDB 刪除之前的操作
- 重新再來一次
2.2.基本概念
- 資料庫
- 是一個倉庫,可以存放集合
- 集合
- 類似於陣列,在集合中可以存放文件
- 文件
- 文件資料庫中最小單位,我們儲存和操作的內容都是文件
- 在mongodb中,資料庫和集合都不需要手動建立,當建立文件時,如果文件所在的集合或資料庫不存在則會自動建立
- 當一個文件的屬性值是一個文件時,內部的文件稱為 內嵌文件,mongoDB支援通過內嵌文件的屬性進行查詢,如果要查詢內嵌文件則可以通過.的形式來匹配,此時必須使用引號
- eg: db.users.find({‘hobby.movies’:‘hero’})
- 資料庫的方法能少調用盡量少呼叫,因為會降低效能
2.3.基本指令
- 顯示當前所有資料庫:show dbs|databases
- 進入到指定的資料庫中:use tes
- 當前所處資料庫:db
- 顯示資料庫中所有集合:show collections
2.4.資料庫的CRUD的操作
2.4.1資料庫中插入文件
-
db.collection_name.insert(doc)
-
向集合中插入一個或多個文件
-
eg: 向test資料庫中,stus集合中插入一個新的學生物件
{name: “www”, age: 18, gender: 男}
db.stus.insert({name: “www”, age: 18, gender: “男”})
-
當我們向集合中插入文件時,如果沒有給文件指定_id屬性,則資料庫自動為文件新增該屬性,該屬性用來作為文件唯一標識;如果自己 _id屬性,需要注意該屬性的唯一性
-
-
db.collection_name.insertOne()
- 插入一個文件
-
db.collection_name.insertMany()
- 插入多個文件
2.4.2資料庫中查詢文件
-
db.collection_name.find()
- 查詢所有文件
- 可以接受一個物件作為條件引數
- find()返回一個數組
-
db.conllection_name.find(“hello”);
-
db.conllection_name.find(“hello”);
-
eg: db.stus.find({idb."hello})’
-
db.collection_name.findOne({{}});
-
db.conllection_name.find(“hello”).count()|length(); //f返回數量
2.4.3資料中更改文件
- db.collection_name.update(查詢條件, 新物件)
- update()預設情況下會自動使用新物件替換就舊物件
- 如果需要指定屬性,而不是替換則需要使用修改操作符
- $set:可以用來修改文件中的指定屬性
- db.stuts.update(匹配條件, {$set: {修改屬性鍵值對}})
- $unset: 刪除屬性,用法同set
- $push: 用於向陣列中新增一個新的元素
- $addToSet: 向陣列中新增一個新元素,如果陣列中已經存在了該元素則新增失敗
- $set:可以用來修改文件中的指定屬性
- update()預設只會修改一個,可以更改multi屬性
- db.collection_name.updateMany()
- 同時修改多個符合條件的文件
- db.collection_name.updateOne()
- 修改一個符合條件的文件
2.4.4資料庫文件刪除
-
db.collection_name.remove()
- remove可以根據條件刪除文件,傳遞條件的方式同find一樣
- 預設會刪除符合條件的所有文件
- 如果傳遞第二個引數,值為true,則只會刪除一個
- 如果傳遞一個空物件,則會刪除所有文件,效能較差,此時可刪除集合:
- db.collection_name.drop()
-
db.collection_name.deleteOne()
- 刪除一個文件
-
db.collection_name.deleteMany()
- 刪除多個文件
-
db.collection_name.drop() 刪除集合
-
db.dropDatabase() 刪除資料庫
-
一般資料庫中的資料都不會刪除,所以刪除的方法很少呼叫
一般會在資料中新增一個欄位,來表示資料是否被刪除
2.5.文件之間的關係
2.5.1 一對一
-
MongoDB中,可以通過內嵌文件的形式來體現出一對一的關係
-
db.wifeAndHusband.insert([ { name: "huangrong", husband: { name: "guojing" } }, { name: "panjinlian", husband: { name: "wudalang" } }, ]);
2.5.2 一對多/多對一
-
使用者 - 訂單
-
對映
-
db.users.insert([ {username: 'swk'}, {username: 'zbj'} ]); db.order.insert({ list: ['apple','banana'], user_id: ObjectId("5fc49a3d759231f39f683f4d") });
2.5.3 多對多
- 分類 - 商品
- 同為對映,把上列user_id改為陣列即可
2.6 補充內容
- 排序
- 查詢文件時,預設情況按_id值進行排序(升序)
- sort() 可以用來指定文件排序的規則,需要傳遞一個物件指定排序規則(屬性名:1|-1)
- limit skip sort 可以以任意的順序進行呼叫
- 投影
- 在查詢時,可以在第二個引數的位置來設定查詢結果的投影
- {屬性名:0|1}
3.Mongoose
-
Mongoose是一個讓我們可以通過Node來操作mongoDB的模組
-
Mongoose是一個物件文件模型(ODM)
-
好處
- 可以為文件建立一個模式結構(Schema) - 約束
- 可以對模型中的物件/文件進行驗證
- 資料可以通過型別轉換為物件模型
- 可以使用中介軟體來應用業務邏輯掛鉤
-
mongoose提供的新物件
- Schema 模式物件
- schema物件定義約束了資料庫中的文件結構
- Model
- Model物件作為集合中的所有文件的表示,相當於mongodb資料庫中的集合collection
- Document
- Document表示集合中的具體文件,相當於集合中的一個具體的文件
- Schema 模式物件
-
使用
- 下載安裝
- npm i mongoose --save
- 在專案中引入mongoose
- var mongoose = require(“mongoose”)
- 連線mongodb資料庫
- mongoose.connect(‘mongodb://資料庫的ip地址:埠號/資料庫名’, {useMongoClient: true})
- 如果埠號預設可以省略不寫
- 斷開資料庫連線(一般不需要)
- mongdb資料庫,一般情況下只需連線一次,之後除非專案停止伺服器關閉,否則連線一般不會斷開
- mongoose.disconnect()
- 下載安裝
-
監聽MongoDB資料庫的連線狀態
- 在mongoose物件中,有一個屬性叫做connection,該物件表示的就是資料庫連線
- 通過監視該物件的狀態,可以來監聽資料庫的連線與斷開
- 資料庫連線成功的事件
- mongoose.connection.once(“open”, function(){});
- 資料庫斷開的事件
- mongoose.connection.once(“close”, function(){});
-
連線資料庫
-
建立schema
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var blogSchema = new Schema({ title: String, author: String, body: String, comments: [{ body: String, date: Date }], date: { type: Date, default: Date.now }, hidden: Boolean, meta: { votes: Number, favs: Number } });
-
通過schema建立model
- model代表的是資料庫中的集合,通過model才能對資料庫進行操作
- mongoose.model(modelName, schema);
- modelName: 要對映的集合(mongoose會自動將集合變為複數)
- schema: 約束
- stuModel.create(doc, function(err){});
-
-
有了model,就可以對資料庫進行增刪改查的操作了
model
-
增加
- Model.create(doc(s), [callback])
- 用來建立一個或多個文件並新增到資料庫中
- 引數:
- doc(s) 可以是一個文件物件,也可以是一個文件物件的陣列
- callback 當操作完成以後呼叫的回撥函式
- Model.create(doc(s), [callback])
-
查詢
-
Model.find()
-
//直接獲取 StuModel.find({name: "唐僧"}, function(err, docs){ if(!err){ console.log(docs); } }); //投影獲取欄位 StuModel.find({},{name:1, _id:0}, function(err, docs){ if(!err){ console.log(docs); } }); //skip:跳過的數量 limit:顯示的數量 StuModel.find({},"name age -_id",{skip: 3, limit: 1}, function(err, docs){ if(!err){ console.log(docs); } });
-
通過find()查詢的結果,返回的物件,就是document,文件物件
-
document物件就是model的例項
-
-
Model.findById()
- 通過id尋找
-
Model.findOne()
- 只返回第一個
-
-
修改
-
Model.update(conditions, doc[, options] [, callback])
-
Model.updateMany(conditions, doc[, options] [, callback])
-
Model.updateOne(conditions, doc[, options] [, callback])
- 引數:
- conditions 查詢條件
- doc 修改後的物件
- options 配置引數
- callback 回撥函式
- 引數:
-
StuModel.updateOne({name:"唐僧"},{$set:{age:20}}, function(err){});
-
-
刪除
-
Model.remove(conditions [, callback])
-
Model.deleteOne(conditions [, callback])
-
Model.deleteMany(conditions [, callback]
-
-
統計文件數量
- Model.count(conditions [,callback])
Document
-
save()
-
Model#save([options], [fn])
-
stu.save(function(err){ if(!err){ console.log("儲存成功"); } })
-
-
update(update, [options], [callback])
-
修改物件
-
StuModel.findOne({}, function(err, doc){ if(!err){ doc.update({$set:{age:28}}, function(err){ console.log("修改成功"); }); // console.log(doc); } });
-
-
remove([callback])
-
刪除物件
-
StuModel.findOne({}, function(err, doc){ if(!err){ doc.remove(function(err){ if(!err){ console.log("大師兄再見"); } }); } });
-
-
get(name)
- 獲取文件中的指定屬性值
-
set(name, value)
- 設定文件的指定的屬性值s
-
id
- 獲取文件的_id 屬性值
-
toObject()
- 將document物件轉換為普通的js物件
- 轉換以後所有的document物件的方法都不能使用了
基本上一個下午的事件看完了整個視訊,只能說計算機語言真的就是相通的,資料庫的操作什麼感覺只要接觸過一個,大體就都差不多,只是可能看用的多不多,用的多熟練度高敲程式碼什麼的思路肯定會更快一些。然後因為這只是一個基於前端的資料庫的學習,學的並不深,都只是講了一些很淺顯的語法等內容,還是那句話,好多東西得用到了才能更快的上手。如果覺得看視訊時間不夠的可以看和,它們講解的也很淺顯,但是看一遍下來能理解的差不多了也,後續就自己查文件吧。