天天看點

一文搞定 mongodb(學習筆記)一、安裝MongoDB二、基礎介紹三、安裝圖形化工具三、CRUD 操作文檔間的關系sort和投影

一、安裝MongoDB

  • 下載下傳位址:https://www.mongodb.com/try/download/community
一文搞定 mongodb(學習筆記)一、安裝MongoDB二、基礎介紹三、安裝圖形化工具三、CRUD 操作文檔間的關系sort和投影
  • 此處我下載下傳的是zip版本,在 E 盤 software 目錄建立了一個

    mongoDB

    的檔案夾,并将壓縮包解壓到了這個檔案夾裡。

建立目錄及配置檔案

  1. 在 bin 目錄同級的目錄建立 data 目錄,繼續在 data 目錄下建立 db 及 log檔案夾。log 目錄中還需要建立 mongod.log 檔案。這個檔案一定要建立否則找不到會報錯。
  • db:表示資料存儲的檔案夾
  • log:表示日志列印的檔案夾
  1. 在 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

  1. 方法一:從配置檔案啟動
一文搞定 mongodb(學習筆記)一、安裝MongoDB二、基礎介紹三、安裝圖形化工具三、CRUD 操作文檔間的關系sort和投影

切換到bin目錄中,執行此指令,表示執行配置檔案(注意修改自己的路徑):

mongod --config E:\software\mongoDB\mongod.cfg --install --serviceName "MongoDB"

  1. 方法二:直接指令行中配置

如果配置檔案執行報錯,無法啟動,那麼就自己在指令行配置mongoDB,切換到bin目錄中,執行此指令(注意修改自己的路徑):

一文搞定 mongodb(學習筆記)一、安裝MongoDB二、基礎介紹三、安裝圖形化工具三、CRUD 操作文檔間的關系sort和投影

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(學習筆記)一、安裝MongoDB二、基礎介紹三、安裝圖形化工具三、CRUD 操作文檔間的關系sort和投影

後續如果修改 mongoDB 的端口就直接改配置檔案,删除服務,再重新執行“添加服務”。

二、基礎介紹

三個概念

  1. 資料庫(database) 資料庫是一個倉庫,在倉庫中可以存放集合。
  2. 集合(collection) 集合類似于數組,在集合中可以存放文檔。
  3. 文檔(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和投影

  1. 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可以任意順序的調用
  1. 投影
  • 查詢時,我們可以在第二個參數的位置來設定查詢結果的投影(指定要顯示的字段)
    • {name: 1, _id: 0}:表示顯示name屬性,不顯示_id屬性。
db.users.find({}, {name: 1, _id: 0, salary: 1});
/*
 這句的含義是隻顯示 name和salary屬性,不顯示 _id屬性
*/
           

複制