一、安裝MongoDB
- 下載下傳位址:https://www.mongodb.com/try/download/community

- 此處我下載下傳的是zip版本,在 E 盤 software 目錄建立了一個
的檔案夾,并将壓縮包解壓到了這個檔案夾裡。mongoDB
建立目錄及配置檔案
- 在 bin 目錄同級的目錄建立 data 目錄,繼續在 data 目錄下建立 db 及 log檔案夾。log 目錄中還需要建立 mongod.log 檔案。這個檔案一定要建立否則找不到會報錯。
- db:表示資料存儲的檔案夾
- log:表示日志列印的檔案夾
- 在 bin 目錄的同級目錄建立 mongod.cfg 檔案,并寫入如下内容(注意:配置件縮進需要使用tab鍵,路徑根據自己的實際情況填寫)。
systemLog:
destination: file
path: E:\software\mongoDB\data\log\mongod.log
storage:
dbPath: E:\software\mongoDB\data\db
net:
port: 27017
複制
- path:配置列印日志的目錄
- dbpath:配置資料的存儲位置
- port:配置的端口号
配置環境變量
打開環境變量中的path,選擇path輕按兩下,打開後點選“建立”,把bin目錄的路徑粘貼進去(我的是:E:\mongoDB\bin)
添加服務(開機自動啟動)
注意:以管理者身份運作CMD
- 方法一:從配置檔案啟動
切換到bin目錄中,執行此指令,表示執行配置檔案(注意修改自己的路徑):
mongod --config E:\software\mongoDB\mongod.cfg --install --serviceName "MongoDB"
- 方法二:直接指令行中配置
如果配置檔案執行報錯,無法啟動,那麼就自己在指令行配置mongoDB,切換到bin目錄中,執行此指令(注意修改自己的路徑):
mongod --dbpath "E:\software\mongoDB\data\db" --logpath "E:\software\mongoDB\data\log\mongod.log" --install --serviceName "MongoDB"
- 開啟伺服器: net start MongoDB
- 關閉伺服器: net stop MongoDB
- 删除服務:sc delete MongoDB
- 打開用戶端: mongo,在cmd視窗輸入便可以連接配接上資料庫
檢視服務
在鍵盤上按 “WIN+R”,輸入“services.msc”指令确定,打開服務後,找到MongoDB,如下圖表示已經成功!
後續如果修改 mongoDB 的端口就直接改配置檔案,删除服務,再重新執行“添加服務”。
二、基礎介紹
三個概念
- 資料庫(database) 資料庫是一個倉庫,在倉庫中可以存放集合。
- 集合(collection) 集合類似于數組,在集合中可以存放文檔。
- 文檔(document) 文檔資料庫中的最小機關,我們存儲和操作的内容都是文檔。
常用指令
- show dbs:顯示目前所有資料庫 show database:顯示目前所有資料庫
- use 資料庫名:進入到指定的資料庫中(不存在則建立)
- db:表示我們目前所處的資料庫
- show collections:顯示我們資料庫中所有的集合
三、安裝圖形化工具
- mongodbmanager:
- 下載下傳位址:https://www.mongodbmanager.com/download
三、CRUD 操作
插入文檔
db.<collection>.insert()
- 向集合中插入一個或多個文檔
- 當我們向集合中插入文檔時,如果沒有給文檔指定_id屬性,則資料庫會自動給文檔添加_id
- 該屬性用來作為文檔的唯一辨別
-
可以自己指定,如果我們指定了,資料庫就不會再添加了,如果自己指定_id必須也確定唯一性_id
db.<collection>.insertOne() //插入一個文檔對象
db.<collection>.insertMany() //插入多個文檔對象
//插入一個文檔對象
db.stus.insert({name:"微客鳥窩",age:18,gender:"男"})
//插入多個文檔對象
db.stus.insert([
{name:"沙和尚",age:36,gender:"男"},
{name:"白骨精",age:16,gender:"女"},
{name:"蜘蛛精",age:14,gender:"女"}
])
複制
查詢文檔
db.<collection>.find()
- find()用來查詢集合中所有符合條件的文檔
- find()可以接收一個對象作為條件參數
- { }:表示查詢集合中所有文檔
- { 屬性:值 }:查詢屬性是指定值的文檔
- 傳回值是一個數組
db.<collection>.findOne()
- 用來查詢集合中符合條件的第一個文檔
- 傳回的是一個文檔
db.<collection>.find({}).count()
- 查詢所有結果的數量
db.stus.find({name:"沙和尚"})
db.stus.find({name:"白骨精",age:16})
db.stus.findOne({gender:"女"})
db.stus.find({}).count()
db.stus.find({}).length()
複制
修改文檔
-
db.<collection>.update(查詢條件,新對象)
- update()預設情況下會使用新對象來替換舊對象
- update()預設隻會修改一個對象 如果需要修改指定的屬性,而不是替換,需要使用 “修改操作符” 來完成修改
- $set:可以用來修改文檔中的指定屬性
- $unset:可以用來删除文檔的指定屬性
-
:同時修改多個符合條件的文檔db.<collection>.updateMany()
-
:修改一個符合條件的文檔db.<collection>.updateOne()
-
:替換一個符合條件的文檔db.<collection>.replaceOne()
- MongoDB的文檔的屬性值也可以是一個文檔,當一個文檔的屬性值是文檔時,我們稱這個文檔為内嵌文檔
- MongoDB支援直接通過内嵌文檔的屬性進行查詢,如果要查詢内嵌文檔可以則可以通過==.的形式來比對,且屬性名必須使用引号==,雙引号單引号都可以
db.stus.find()
db.stus.update(
{name:"白骨精"},{age:28}
)
db.stus.update(
{"name":"沙和尚"},
{$set:{
gender:"男",
address:"流沙河"
}}
)
//update()預設修改一條 = updateOne()
db.stus.update(
{"name":"沙和尚"},
{$unset:{address:"流沙河"}}
)
db.stus.updateMany(
{"name" :"豬八戒"},
{$set:{address:"高老莊"}}
)
//multi:true 則可修改所有滿足條件的文檔
db.stus.update(
{"name" :"豬八戒"},
{$set:{address:"豬老莊"}},
{multi:true}
)
複制
删除文檔
db.<collection>.remove()
- 可以根據條件來删除文檔,傳遞條件的方式和find()一樣
- 能删除符合條件的所有文檔,預設删除多個
- 如果第二個參數傳遞一個true,則隻會删除一個
- 如果隻傳遞一個{ }作為參數,則會删除集合中的所有文檔(效果相當于drop(),但是性能不如drop())
-
db.<collection>.deleteOne()
-
db.<collection>.deleteMany()
-
db.<collection>.drop()
- 删除集合(如果最後一個集合沒了,資料庫也沒了)
-
删除資料庫db.dropDatabase()
練習
//添加兩萬條資料的性能高,盡量少調用系統的方法
var arr=[];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.user.insert(arr);
//查詢numbers中num大于5000的文檔
db.unmbers.find({num:{$gt:500}})
//查詢numbers中num小于30的文檔
db.unmbers.find({num:{$lt:500}})
//查詢numbers中num大于40小于50的文檔
db.numbers.find({num:{$gt:40,$lt:50}})
//查詢numbers前10條的資料
db.numbers.find({num:{$lte:10}})
//limit()設定顯示資料的上限
db.numbers.find().limit(10)
//查詢numbers中第11條到20條的資料
//skip()用于跳過指定數量的資料 skip( (頁碼-1)*每頁顯示的條數 ).limit(每頁顯示的條數)
//MongoDB會自動調整limit()和skip()的位置,下面兩條語句效果一樣
db.numbers.find().skip(10).limit(10)
db.numbers.find().limit(10).skip(10)
複制
文檔間的關系
一對一(one to one)
- 夫妻
- 在MongoDB中,可以通過内嵌文檔的形式來展現出一對一的關系
db.WifeAndHusband.insert([
{
wife:"黃蓉",
husband:{
name:"郭靖"
}
},
{
wife:"潘金蓮",
husband:{
name:"武大郎"
}
}
])
複制
一對多(one to many)
- 一對多:父母和孩子、使用者和訂單、文章和評論,也可以通過内嵌文檔的方式來映射一對多的關系(将1的那個屬性設定為多的裡面的字段)
// 第一句是建立了兩個使用者, 分别是孫悟空和豬八戒
db.users.insert([{name:"孫悟空"}, {name:"豬八戒"}]);
// 這一句是查詢使用者内容, 這是需要知道使用者的_id,進而在第三句加入
db.users.find();
// 這是生成了一個訂單,并且user_id存儲的是孫悟空的id
db.orders.insert({list_name:["香蕉", "桃子"], user_id: ObjectId("812419dc00852cj76m2b4d10")})
// 再生成了一個訂單,并且user_id存儲的是孫悟空的id
db.orders.insert({list_name:["西瓜", "人參果"], user_id: ObjectId("812419dc00852cj76m2b4d10")})
// 在users裡查找到孫悟空這個使用者的id,再通過此id查找孫悟空的訂單
let userId = db.users.findOne({name:"孫悟空"})._id;
// 使用id來查找訂單
db.orders.find({user_id: userId});
複制
多對多(many to many)
- 分類和商品,通過内嵌文檔的方式
db.teacher.insert([
{name:"洪七公"},
{name:"黃藥師"},
{name:"龜仙人"}
])
db.stus.insert([
{
name:"郭靖",
tech_ids:[
ObjectId("62077e5c10b3aaaec77e55b9"),
ObjectId("62077e5c10b3aaaec77e55ba")
]
},
{
name:"孫悟空",
tech_ids:[
ObjectId("62077e5c10b3aaaec77e55bb"),
ObjectId("62077e5c10b3aaaec77e55bc"),
ObjectId("62077eb210b3aaaec77e55bd")
]
}
])
複制
sort和投影
- sort
- find()查詢文檔時,預設情況是按照_id的值進行升序排列
- sort()可以用來指定文檔的排序的規則,需要傳遞一個屬性來指定排序規則,1表示升序,-1表示降序
db.users.find({}).sort({age:1})
db.users.find({}).sort({age:1,salary:-1}) //先指定age的升序 再salary的降序
複制
- limit、skip、sort可以任意順序的調用
- 投影
- 查詢時,我們可以在第二個參數的位置來設定查詢結果的投影(指定要顯示的字段)
- {name: 1, _id: 0}:表示顯示name屬性,不顯示_id屬性。
db.users.find({}, {name: 1, _id: 0, salary: 1});
/*
這句的含義是隻顯示 name和salary屬性,不顯示 _id屬性
*/
複制