mongodb想速成嗎,這個系列教程你可以看看(1)

lio-mengxiang發表於2019-04-09

1、mongodb簡介

  • MongoDB 是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統。

  • 在高負載的情況下,新增更多的節點,可以保證伺服器效能。

  • MongoDB 旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。

  • MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列

mongodb想速成嗎,這個系列教程你可以看看(1)

2、mongodb下載地址

www.mongodb.com/download-ce… 選擇適合自己的版本。

mongodb想速成嗎,這個系列教程你可以看看(1)

  • 需要注意的是,例如windows下,安裝完成需要把環境變數設定到你安裝mongodb資料夾的bin目錄下。
  • 比如我安裝mongodb到E:\mongodb所以bin目錄就是E:\mongodb\bin

3、mongodb 的適用場景和基本概念

3.1 MongoDB適用場景

  • 網站資料、快取等大尺寸、低價值的資料

  • 在高伸縮性的場景,用於物件及JSON資料的儲存。

3.2 MongoDB的基本概念

資料庫

MongoDB的一個例項可以擁有一個或多個相互獨立的資料庫,每個資料庫都有自己的集合。

集合

集合可以看作是擁有動態模式的表。

文件

文件是MongoDB中基本的資料單元,類似於RDB的行。文件是鍵值對的一個有序集合。在JS中,文件被表示成物件。

_id

每個文件都有個特殊的“_id”,在文件所屬集合中是唯一的。

JavaScript shell

MongoDB自帶了一個功能強大的JavaScript Shell,可以用於管理或操作MongoDB

舉例

  • 資料庫 MongoDB的單個例項可以容納多個獨立的資料庫,比如一個學生管理系統就可以對應一個資料庫例項
  • 集合 資料庫是由集合組成的,一個集合用來表示一個實體,如學生集合
  • 文件 集合是由文件組成的,一個文件表示一條記錄,比如一位同學張三就是一個文件
    mongodb想速成嗎,這個系列教程你可以看看(1)

4、新增和刪除服務

新增服務 在命令列工具裡

mongod.exe --dbpath E:\mongodata --logpath E:\mongolog --logappend --directoryperdb --serviceName mongodb --install
複製程式碼
  • --dbpath 指定資料存放目錄
  • --logpath 日誌放在哪裡
  • --logappend 日誌寫入方式,可以給老日誌加
  • --directoryperdb 將每個資料庫單獨存放
  • --serviceName 起的服務名字叫
  • --install 安裝服務 下圖表示新增服務成功了
    mongodb想速成嗎,這個系列教程你可以看看(1)

5、mongodb啟動與連線

啟動mongodb服務

mongod --dbpath=E:\Mongodb\data
複製程式碼

如果出現waiting for connections on port 27017就表示啟動成功,已經在27017埠上監聽了客戶端的請求注:啟動說明

選項 含義
--port 指定服務埠號,預設埠27017
--logpath 指定MongoDB日誌檔案,注意是指定檔案不是目錄
--logappend 使用追加的方式寫日誌
--dbpath 指定資料庫路徑
--directoryperdb 設定每個資料庫將被儲存在一個單獨的目錄

接著,再開啟一個新的命令列視窗,輸入

mongo 
複製程式碼

就可以連結到資料庫了

最後介紹一款mongodb視覺化工具 Studio3T

studio3t.com/

6、資料庫操作

6.1 使用資料庫

use database_name 
// 例如我們這裡可以建一個叫school的資料庫
use school
複製程式碼

database_name 代表資料庫的名字

注:如果此資料庫存在,則切換到此資料庫下,如果此資料庫還不存在也可以切過來,但是並不能立刻建立資料庫 切換到 school資料庫下

mongodb想速成嗎,這個系列教程你可以看看(1)

6.2 檢視所有資料庫

show dbs
複製程式碼

備註: 我們剛建立的資料庫school如果不在列表內, 要顯示它,我們需要向school資料庫插入一些資料 db.students.insert({age:1});

inert資料之後

mongodb想速成嗎,這個系列教程你可以看看(1)

6.3 檢視當前使用的資料庫

db
複製程式碼

注:db代表的是當前資料庫 也就是school這個資料庫

mongodb想速成嗎,這個系列教程你可以看看(1)

6.4 刪除資料庫

db.dropDatabase()
複製程式碼

school資料庫就沒了

mongodb想速成嗎,這個系列教程你可以看看(1)

7、集合操作

7.1 檢視集合幫助

use demo
db.demo.help()
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

7.2 建立集合

7.2.1 建立一個空集合

db.createCollection(collection_Name) 
複製程式碼

collection_Name集合的名稱

mongodb想速成嗎,這個系列教程你可以看看(1)

7.2.2 建立集合並插入一個文件

collection_Name集合的名稱 document要插入的文件

db.collection_Name.insert(document)
// 例如
db.demo.insert({age:1})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)
注:上圖裡的objectId是有規律的,規律如下

之前我們使用MySQL等關係型資料庫時,主鍵都是設定成自增的。但在分散式環境下,這種方法就不可行了,會產生衝突。為此,MongoDB採用了一個稱之為ObjectId的型別來做主鍵。ObjectId是一個12位元組的 BSON 型別字串。按照位元組順序,一次代表:

- -
4位元組: UNIX時間戳
3位元組: 表示執行MongoDB的機器
2位元組: 表示生成此_id的程式
3位元組: 由一個隨機數開始的計數器生成的值

7.3 檢視資料庫下的集合

show collections
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

7.4 檢視當前集合

db.getName() 或者 db
複製程式碼

7.5 刪除當前集合

db.dropDatabase()
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

8. 插入文件

8.1 insert

db.collection_name.insert(document);
複製程式碼

collection_name 集合的名字

document 插入的文件

注:每當插入一條新文件的時候mongodb會自動為此文件生成一個_id屬性,_id一定是唯一的,用來唯一標識一個文件 _id也可以直接指定,但如果資料庫中此集合下已經有此_id的話插入會失敗

db.demo.insert({_id:1,age:1});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

mongodb想速成嗎,這個系列教程你可以看看(1)

8.2 save

db.collection_name.save(document)
複製程式碼

collection_name 集合的名字 document 插入的文件

注:如果不指定 _id 欄位 save() 方法類似於 insert() 方法。如果指定 _id 欄位,則會更新該 _id 的資料。 我們save之前儲存過的id=1的資料,看是不是更新了此條資料

db.demo.save({_id:1, age:2})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

9. 更新文件

db.collection.update(
   <query>,
   <updateObj>,
   {
     upsert: <boolean>,
     multi: <boolean>
   }
)
複製程式碼
引數 -
query 查詢條件,指定要更新符合哪些條件的文件
update 更新後的物件或指定一些更新的操作符
$set 在原基礎上累加
upsert 可選,這個引數的意思是,如果不存在符合條件的記錄時是否插入updateObj. 預設是false,不插入。
multi 可選,mongodb 預設只更新找到的第一條記錄,如果這個引數為true,就更新所有符合條件的記錄。

9.1 更新文件

db.demo.insert({name: 'zhangsan'});
db.demo.update({name:'zhangsan'},{age:12})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

9.2 upsert

將students集合中資料中name是lisi的值修改為lisi,因為原表根本不存在name:lisi的,原本不會插入這一條資料,但是upsert選項設為了true就插入成功了

db.demo.update({name:'lisi'}, {name:'lisi'}, {upsert:true});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

9.3 multi

如果有多條age是1的資料只更新一條,如果想全部更新需要指定{multi:true}的引數

db.school.insert({age:1});
db.school.insert({age:1});
db.school.insert({age:1});
db.school.update({age:1}, {$set:{name:'lisi'}}, {multi:true});
db.school.find({})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10、更新操作符

10.1 $set

直接指定更新後的值

use c3;
db.c3.insert({name:'a'});
db.c3.update({name:'a'},{$set:{age:10}});
db.c3.find({})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.2 $inc

在原基礎上累加

db.c3.update({name:'a'},{$inc:{age:1}});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.3 $unset

刪除指定的鍵

db.c3.update({name:'2'},{$unset:{age:11}});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.4 $push

向陣列中新增元素

var result = db.student.update({name:'張三'},{
    $push:{"hobbys":"smoking"}
});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.5 $ne

$ne類似於MYSQL的 not in 或者not exists

db.c3.update({hobbys:{$ne:"eating"}},{$push:{"hobbys":"sleeping"}});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.6 $addToSet

向集合中新增元素

db.c3.update({a:1},{$addToSet:{"hobbys":"smoking"}});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.7 $each

把陣列中的元素逐個新增到集合中

db.a.insert({name:'a', hobbys:[1,2]});
db.a.update({name:'a'},{$addToSet:{hobbys:{$each:[3,4]}}});
db.a.find()
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.8 $pop

從陣列中移除指定的索引中對應的元素

  • {$pop:{"key":1}}從陣列末尾刪除一個與元素
  • {$pop:{"key":-1}}從陣列開頭刪除一個與元素
db.c3.update({name:'a'},{$pop:{hobbys:1}});
db.c3.find()
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

10.9 修改指定索引元素

db.c3.update({name:'zfpx1'},{$set:{"hobbys.0":"smoking2"}});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

11、文件的刪除

remove方法是用來移除集合中的資料

11.1 語法

db.collection.remove(
   <query>,
   {
     justOne: <boolean>
   }
)
複製程式碼

11.2 引數

- -
query (可選)刪除的文件的條件。
justOne (可選)如果設為 true 或 1,則只刪除匹配到的多個文件中的第一個

11.3 例項

刪除worker集合裡name是zfpx2的所有文件資料

db.c3.remove({name:'a'});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)
即使匹配多條也只刪除一條

db.c3.remove({name:'a'},{justOne:true});
複製程式碼

12、查詢文件

12.1 find

語法

db.collection_name.find()
複製程式碼

引數

- -
collection_name 集合的名字

例項

查詢c3下所有的文件

db.students.find()
複製程式碼

12.2 查詢指定列

語法

db.collection_name.find({queryWhere},{key:1,key:1})
複製程式碼

引數列表

- -
collection_name 集合的名字
queryWhere 參閱查詢條件操作符
key 指定要返回的列
1 表示要顯示

例項

只返回顯示age列

db.c3.insert([{name:1,age:2},{name:1,age:3},{name:1,age:4}]);
db.c3.find({},{_id:0, age:1});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

12.3 findOne

查詢匹配結果的第一條資料 語法

db.collection_name.findOne()
複製程式碼

例項

db.c3.findOne()`
複製程式碼

12.4 $in

查詢欄位在某個範圍內

db.c3.insert([{age:30, name:1},{age:100, name:2},{age:40, name:3},{age:60, name:4}])
db.c3.find({age:{$in:[30,100]}},{name:1,age:1});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

12.5 $nin

查詢欄位不在某個範圍內

db.c3.find({age:{$nin:[30,100]}},{name:1,age:1});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

12.6 $not

對特定條件取反

db.c3.find({age:{$not:{$gte:20,$lte:30}}});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

12.7 array

對陣列的查詢

// 按所有元素匹配
 db.c3.find({friends:[ "A", "B", "C", "D" ]});
 
//匹配一項 包含A的就可以
db.c3.find({friends:"A"});

// $all 必須同時包含A B
db.c3.find({friends:{$all:['A',"B"]}});

// $in 或者關係 ,包含A或者B
db.c3.find({friends:{$in:['A',"B"]}});
//$size 按陣列的長度去匹配
db.c3.find({friends:{$size:4}});

//$slice 只返回陣列中的某一部分
db.c3.find({friends:{$size:5}},{name:1,friends:{$slice:2}});
db.c3.find({friends:{$size:5}},{name:1,friends:{$slice:-2}});
$slice:["$array", [startIndex, ] length ] (startIndex可以省略,預設從0開始)
db.c3.find({},{friends:{$slice:[0,3]}});
複製程式碼

12.8 where

db.c3.find({$where:"this.age>30"},{name:1,age:1});
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

12.9 cursor

遊標不是查詢結果,而是查詢的一個返回資源或者介面,通過這個介面,可以逐條讀取資料

var result = db.student.find();

while(result.hasNext()){
    printjson(result.next());
}
複製程式碼

13、條件操作符

條件操作符用於比較兩個表示式並從mongoDB集合中獲取資料

13.1 大於、大於等於、小於、小於等於操作符

引數

- -
$gt 大於
$gte 大於等於
$lt 小於
$lte 小於等於

13.2 使用 _id進行查詢

語法

db.collectoin_name.find({"_id" : ObjectId("value")})
複製程式碼

查詢_id是 562af23062d5a57609133974 資料

db.stuc3dents.find({_id:ObjectId("5adb666ecd738e9771638985")}); 
複製程式碼

13.8 查詢結果集的條數

語法

db.collectoin_name.find().count();
複製程式碼
db.c3.find().count()
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

13.9 正則匹配

語法

db.collection.find({key:/value/})
複製程式碼

引數

- -
collectoin_name 集合名稱
key 欄位
value

查詢name裡包含joe的資料,正則只能匹配字串

db.user.find({name:/joe/})
複製程式碼

14、與和或

14.1 and

find方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開

語法

db.collection_name.find({key1:value1, key2:value2})
複製程式碼

查詢name是1並且age是30的資料

db.students.find({name:1,age:30})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

14.2 or

語法

db.collection_name.find(
   {
      $or: [
   {key1: value1}, {key2:value2}
      ]
   }
)
複製程式碼

查詢age = 30 或者 age = 100 的資料

db.c3.find({$or:[{age:30},{age:100}]})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

14.3 and和or聯用

語法

db.collection_name.find(
   {
     key1:value1,
     key2:value2,
     $or: [
   {key1: value1},
   {key2:value2}
     ]
   }

)
複製程式碼

例項 查詢 age是30 並且 name是1或者 name是 3 的資料

db.c3.find({age: 30, $or:[{name:1},{age:3}]})
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

15、分頁查詢

15.1 limit

讀取指定數量的資料記錄 語法

db.collectoin_name.find().limit(number)
複製程式碼
var a = [];
for(var i = 0;i<10;i++){
    a.push({age:i})
};
db.c3.insert(a);
db.students.find().limit(3)
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

15.2 skip

跳過指定數量的資料,skip方法同樣接受一個數字引數作為跳過的記錄條數 語法

db.collectoin_name.find().skip(number)
複製程式碼
db.c3.find().skip(3)
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

15.3 skip+limit

通常用這種方式來實現分頁功能 語法

db.collectoin_name.find().skip(skipNum).limit(limitNum)
複製程式碼
db.c3.find().skip(3).limit(3);
複製程式碼

mongodb想速成嗎,這個系列教程你可以看看(1)

15.4 sort排序

sort()方法可以通過引數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用於降序排列。 語法

db.collectoin_name.find().sort({key:1})
db.collectoin_name.find().sort({key:-1})
複製程式碼
db.c3
![](https://user-gold-cdn.xitu.io/2019/4/9/169fff28b40c6b57?w=502&h=220&f=jpeg&s=21589).find().sort({age:1})
複製程式碼

相關文章