1、mongodb簡介
-
MongoDB 是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統。
-
在高負載的情況下,新增更多的節點,可以保證伺服器效能。
-
MongoDB 旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。
-
MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列
2、mongodb下載地址
www.mongodb.com/download-ce… 選擇適合自己的版本。
- 需要注意的是,例如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的單個例項可以容納多個獨立的資料庫,比如一個學生管理系統就可以對應一個資料庫例項
- 集合 資料庫是由集合組成的,一個集合用來表示一個實體,如學生集合
- 文件 集合是由文件組成的,一個文件表示一條記錄,比如一位同學張三就是一個文件
4、新增和刪除服務
新增服務 在命令列工具裡
mongod.exe --dbpath E:\mongodata --logpath E:\mongolog --logappend --directoryperdb --serviceName mongodb --install
複製程式碼
- --dbpath 指定資料存放目錄
- --logpath 日誌放在哪裡
- --logappend 日誌寫入方式,可以給老日誌加
- --directoryperdb 將每個資料庫單獨存放
- --serviceName 起的服務名字叫
- --install 安裝服務 下圖表示新增服務成功了
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
6、資料庫操作
6.1 使用資料庫
use database_name
// 例如我們這裡可以建一個叫school的資料庫
use school
複製程式碼
database_name 代表資料庫的名字
注:如果此資料庫存在,則切換到此資料庫下,如果此資料庫還不存在也可以切過來,但是並不能立刻建立資料庫 切換到 school資料庫下
6.2 檢視所有資料庫
show dbs
複製程式碼
備註: 我們剛建立的資料庫school如果不在列表內, 要顯示它,我們需要向school資料庫插入一些資料 db.students.insert({age:1});
inert資料之後
6.3 檢視當前使用的資料庫
db
複製程式碼
注:db代表的是當前資料庫 也就是school這個資料庫
6.4 刪除資料庫
db.dropDatabase()
複製程式碼
school資料庫就沒了
7、集合操作
7.1 檢視集合幫助
use demo
db.demo.help()
複製程式碼
7.2 建立集合
7.2.1 建立一個空集合
db.createCollection(collection_Name)
複製程式碼
collection_Name集合的名稱
7.2.2 建立集合並插入一個文件
collection_Name集合的名稱 document要插入的文件
db.collection_Name.insert(document)
// 例如
db.demo.insert({age:1})
複製程式碼
注:上圖裡的objectId是有規律的,規律如下
之前我們使用MySQL等關係型資料庫時,主鍵都是設定成自增的。但在分散式環境下,這種方法就不可行了,會產生衝突。為此,MongoDB採用了一個稱之為ObjectId的型別來做主鍵。ObjectId是一個12位元組的 BSON 型別字串。按照位元組順序,一次代表:
- | - |
---|---|
4位元組: | UNIX時間戳 |
3位元組: | 表示執行MongoDB的機器 |
2位元組: | 表示生成此_id的程式 |
3位元組: | 由一個隨機數開始的計數器生成的值 |
7.3 檢視資料庫下的集合
show collections
複製程式碼
7.4 檢視當前集合
db.getName() 或者 db
複製程式碼
7.5 刪除當前集合
db.dropDatabase()
複製程式碼
8. 插入文件
8.1 insert
db.collection_name.insert(document);
複製程式碼
collection_name 集合的名字
document 插入的文件
注:每當插入一條新文件的時候mongodb會自動為此文件生成一個_id屬性,_id一定是唯一的,用來唯一標識一個文件 _id也可以直接指定,但如果資料庫中此集合下已經有此_id的話插入會失敗
db.demo.insert({_id:1,age: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})
複製程式碼
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})
複製程式碼
9.2 upsert
將students集合中資料中name是lisi的值修改為lisi,因為原表根本不存在name:lisi的,原本不會插入這一條資料,但是upsert選項設為了true就插入成功了
db.demo.update({name:'lisi'}, {name:'lisi'}, {upsert:true});
複製程式碼
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({})
複製程式碼
10、更新操作符
10.1 $set
直接指定更新後的值
use c3;
db.c3.insert({name:'a'});
db.c3.update({name:'a'},{$set:{age:10}});
db.c3.find({})
複製程式碼
10.2 $inc
在原基礎上累加
db.c3.update({name:'a'},{$inc:{age:1}});
複製程式碼
10.3 $unset
刪除指定的鍵
db.c3.update({name:'2'},{$unset:{age:11}});
複製程式碼
10.4 $push
向陣列中新增元素
var result = db.student.update({name:'張三'},{
$push:{"hobbys":"smoking"}
});
複製程式碼
10.5 $ne
$ne類似於MYSQL的 not in 或者not exists
db.c3.update({hobbys:{$ne:"eating"}},{$push:{"hobbys":"sleeping"}});
複製程式碼
10.6 $addToSet
向集合中新增元素
db.c3.update({a:1},{$addToSet:{"hobbys":"smoking"}});
複製程式碼
10.7 $each
把陣列中的元素逐個新增到集合中
db.a.insert({name:'a', hobbys:[1,2]});
db.a.update({name:'a'},{$addToSet:{hobbys:{$each:[3,4]}}});
db.a.find()
複製程式碼
10.8 $pop
從陣列中移除指定的索引中對應的元素
- {$pop:{"key":1}}從陣列末尾刪除一個與元素
- {$pop:{"key":-1}}從陣列開頭刪除一個與元素
db.c3.update({name:'a'},{$pop:{hobbys:1}});
db.c3.find()
複製程式碼
10.9 修改指定索引元素
db.c3.update({name:'zfpx1'},{$set:{"hobbys.0":"smoking2"}});
複製程式碼
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'});
複製程式碼
即使匹配多條也只刪除一條
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});
複製程式碼
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});
複製程式碼
12.5 $nin
查詢欄位不在某個範圍內
db.c3.find({age:{$nin:[30,100]}},{name:1,age:1});
複製程式碼
12.6 $not
對特定條件取反
db.c3.find({age:{$not:{$gte:20,$lte:30}}});
複製程式碼
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});
複製程式碼
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()
複製程式碼
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})
複製程式碼
14.2 or
語法
db.collection_name.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
複製程式碼
查詢age = 30 或者 age = 100 的資料
db.c3.find({$or:[{age:30},{age:100}]})
複製程式碼
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}]})
複製程式碼
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)
複製程式碼
15.2 skip
跳過指定數量的資料,skip方法同樣接受一個數字引數作為跳過的記錄條數 語法
db.collectoin_name.find().skip(number)
複製程式碼
db.c3.find().skip(3)
複製程式碼
15.3 skip+limit
通常用這種方式來實現分頁功能 語法
db.collectoin_name.find().skip(skipNum).limit(limitNum)
複製程式碼
db.c3.find().skip(3).limit(3);
複製程式碼
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})
複製程式碼