004.MongoDB數據庫基礎使用

一 數據庫管理

1.1 建立數據庫

  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use admin
  3 > db.grantRolesToUser( "useradmin",[{ role: "dbOwner",db:"mydb" }])	#受權
  4 > use mydb					#若存在mymongodb則切換,若不存在則建立
  5 > show dbs
  6 admin   0.000GB
  7 config  0.000GB
  8 local   0.000GB
  9 > db.age01.insert({"name": "xianghongying"})
 10 WriteResult({ "nInserted" : 1 })		#輸出信息
 11 > show dbs
 12 admin   0.000GB
 13 config  0.000GB
 14 local   0.000GB
 15 mydb    0.000GB
 
提示:新建立的數據庫,若須要顯示須要向該數據庫中建立集合,同時集合只有在內容插入後纔會建立,即建立集合(數據表)後要再插入一個文檔(記錄),集合纔會真正建立。

1.2 刪除數據庫

  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 switched to db mydb				#輸出信息
  4 > db.dropDatabase()
  5 { "dropped" : "mydb", "ok" : 1 }
 

二 集合管理

2.1 建立集合

語法格式:
  1 db.createCollection(name, options)
參數說明:
  • name: 要建立的集合名稱
  • options: 可選參數, 指定有關內存大小及索引的選項
options 能夠是以下參數:


字段

 

類型

 

描述
capped
布爾
(可選)若是爲 true,則建立固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最先的文檔。
當該值爲 true 時,必須指定 size 參數。
autoIndexId
布爾
(可選)如爲 true,自動在 _id 字段建立索引。默認爲 false。
size
數值
(可選)爲固定集合指定一個最大值(以字節計)。
若是 capped 爲 true,也須要指定該字段。
max
數值
(可選)指定固定集合中包含文檔的最大數量。
在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,而後檢查 max 字段。
  1 > use mydb
  2 > db.createCollection("age01")
  3 { "ok" : 1 }				#輸出信息
  4 > show tables				#也可以使用show collections
  5 age01
  6 > db.createCollection("age02",{ capped: true, autoIndexId : true, size: 6142800, max: 10000})
  7 {
  8         "note" : "the autoIndexId option is deprecated and will be removed in a future release",
  9         "ok" : 1
 10 }
 11 #建立固定集合 age02,整個集合空間大小 6142800 KB, 文檔最大個數爲 10000 個。
 12 > db.age03.insert({"name": "xianghongying","age": "18"})
 13 WriteResult({ "nInserted" : 1 })
 14 > show tables
 15 age01
 16 age02
 17 age03
 
提示:MongoDB中可直接插入文檔,便可自動建立集合。

2.2 刪除集合

語法格式:
  1 db.collection.drop()
提示:若是成功刪除選定集合,則 drop() 方法返回 true,不然返回 false。
  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > show tables
  4 age01
  5 age02
  6 age03
  7 > db.age03.drop()
  8 true
  9 > show tables
 10 age01
 11 age02
 

三 文檔管理

3.1 插入文檔

文檔的數據結構和 JSON 基本同樣。
全部存儲在集合中的數據都是 BSON 格式。
BSON 是一種相似 JSON 的二進制形式的存儲格式,是 Binary JSON 的簡稱。
語法格式:
  1 db.COLLECTION_NAME.insert(document)
  2 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  3 > use mydb
  4 > db.age01.insert({name: 'zhangsan',
  5 age: '18',
  6 tel: '123456781',
  7 love: ['apple','banana']
  8 })
  9 WriteResult({ "nInserted" : 1 })		#輸出信息
 
提示:MongoDB插入文檔的時候,若是該集合不在該數據庫中,MongoDB 會自動建立該集合並插入文檔。

3.2 查看文檔

  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > db.age01.find()
  4 > db.age01.find().pretty()
 
001
將數據定義爲一個變量,而後插入此變量的方式插入文檔。
  1 > lisi_age=({name: 'lisi', age: '19', tel: '123456782', love: ['apple','orange']})
  2 > db.age01.insert(lisi_age)
  3 WriteResult({ "nInserted" : 1 })		#輸出信息
  4 > db.age01.find().pretty()
 
002

3.3 其餘方式

向指定集合中插入一條文檔數據。
  1 > db.age01.insertOne({name: 'wanger', age: '15', tel: '123456783', love: ['pear','orange']})
  2 向指定集合中插入多條文檔數據。
  3 > db.age01.insertMany([{name: 'mazi', age: '15', tel: '123456784', love: ['pear','apple']},{name: 'xiaoming', age: '8', tel: '123456785', love: ['apple','grape']}])
 
003
  1 > db.age01.find().pretty()
004

四 更新文檔

4.1 update方法

update() 方法用於更新已存在的文檔。
語法格式:
  1 db.collection.update(
  2    <query>,
  3    <update>,
  4    {
  5      upsert: <boolean>,
  6      multi: <boolean>,
  7      writeConcern: <document>
  8    }
  9 )
 
參數說明:
  • query : update的查詢條件,相似sql update查詢的where所跟的條件。
  • update : update的對象和一些更新的操做符(如$,$inc...)等,相似sql update查詢的set所跟的更新操做。
  • upsert : 可選,這個參數的意思是,若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入。
  • multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。
  • writeConcern :可選,拋出異常的級別。
  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > db.age01.update({name: "xiaoming"},{$set:{love: ['strawberry','orange']}})
  4 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })	#輸出信息
  5 > db.age01.find().pretty()
005
  1 > db.age01.update({age: '15'},{$set:{tel: '133333333'}},{multi:true})	#修改多條
  2 WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
  3 > db.age01.find().pretty()
 
006

4.2 save方法

save() 方法經過傳入的文檔來替換已有文檔。
語法格式:
  1 db.collection.save(
  2    <document>,
  3    {
  4      writeConcern: <document>
  5    }
  6 )
 
參數說明:
  • document : 文檔數據。
  • writeConcern :可選,拋出異常的級別。
  1 > db.age01.save({_id: ObjectId("5ceb9b2785cdc85ba0f3d6a3"),name: 'zhangsan', age: '14', tel: '155555555', love: ['peach','waxberry']})
  2 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })	#輸出信心
  3 > db.age01.find().pretty()
 
007

4.3 其餘方式

向指定集合中更新一條文檔數據。
  1 > db.age01.updateOne({name: 'lisi'}, {$set:{age: '28'}})
  2 { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
 
向指定集合中更新多條文檔數據。
  1 > db.age01.updateMany({age: {$gt: '15'}}, {$set:{tel: '188888888'}})
  2 { "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
 
 
只更新第一條記錄:
  1 db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
所有更新:
  1 db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一條:
  1 db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
所有添加進去:
  1 db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
所有更新:
  1 db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一條記錄:
  1 db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

五 刪除文檔

5.1 刪除文檔

remove() 方法的基本語法格式以下所示:
  1 db.collection.remove(
  2    <query>,
  3    {
  4      justOne: <boolean>,
  5      writeConcern: <document>
  6    }
  7 )
 
參數說明:
  • query :(可選)刪除的文檔的條件。
  • justOne : (可選)若是設爲 true 或 1,則只刪除一個文檔,若是不設置該參數,或使用默認值 false,表示刪除全部匹配條件的文檔。
  • writeConcern :(可選)拋出異常的級別
提示:建議在執行remove()函數前先執行find()命令來判斷執行的條件是否正確。
  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > db.age01.find().pretty()
 
008
向指定集合中刪除一條文檔數據。
  1 > db.age01.deleteOne({"name" : "xiaoming"})
  2 WriteResult({ "nRemoved" : 1 })
  3 > db.age01.find().pretty()
 
009
向指定集合中刪除多條文檔數據。
  1 > db.age01.deleteMany({tel: '133333333'})
  2 { "acknowledged" : true, "deletedCount" : 2 }
 
向指定集合中刪除所有文檔數據。
  1 > db.collection.deleteMany({})
提示:新版MongoDB也支持舊版remove()方式刪除(官方不建議)。但remov並不會真正釋放空間,須要執行db.repairDatabase()回收磁盤空間。

六 查詢文檔

6.1 簡單查詢

MongoDB 查詢文檔使用 find() 方法。
find() 方法以非結構化的方式來顯示全部文檔。
語法格式:
  1 db.collection.find(query, projection)
參數說明:
  • query :可選,使用查詢操做符指定查詢條件。
  • projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。
以易讀的方式來讀取數據,可使用 pretty() 方法,語法格式:
  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > db.age01.find().pretty()		#pretty() 方法以格式化的方式來顯示全部文檔
 
010

6.2 多個條件

MongoDB 的 find() 方法能夠傳入多個鍵(key),每一個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。
語法格式:
  1 > db.collection.find({key1:value1, key2:value2}).pretty()
  2 > db.age01.find({age: {$gt:'10'}, tel: '188888888'}).pretty()
 
011
MongoDB 的 find() 方法能夠傳入多個鍵(key),使用關鍵字 $or,,即常規 SQL 的 OR 條件。
語法格式:
  1 > db.col.find(
  2    {
  3       $or: [
  4          {key1: value1}, {key2:value2}
  5       ]
  6    }
  7 ).pretty()
  8 > db.age01.find({$or:[{age: {$gt: '14'}},{tel: '188888888'}]}).pretty()
 
012
MongoDB 支持多個條件聯合使用,AND 和 OR 聯合使用,相似常規 SQL 語句爲: 'where likes >50 AND (name = 'zhangsna' OR tel = '188888888')'
  1 > db.age01.find({age: {$gt: '10'},$or:[{name: 'zhangsan'},{tel: '188888888'}]}).pretty()
013
控制查詢範圍: 查詢大於15,小於28歲。
  1 > db.age01.find({age: {$gt: '14',$lt: '28'}}).pretty()
014
控制查詢匹配後須要顯示的數據:
  1 > db.age01.find({name: 'zhangsan'},{name: 1, age: 1}).pretty()	#僅顯示name和age
  2 {
  3         "_id" : ObjectId("5ceb9b2785cdc85ba0f3d6a3"),
  4         "name" : "zhangsan",
  5         "age" : "14"
  6 }
  7 > db.age01.find({name: 'zhangsan'},{name: 0}).pretty()		#不顯示name
  8 {
  9         "_id" : ObjectId("5ceb9b2785cdc85ba0f3d6a3"),
 10         "age" : "14",
 11         "tel" : "155555555",
 12         "love" : [
 13                 "peach",
 14                 "waxberry"
 15         ]
 16 }
 
解釋:inclusion模式 指定返回的鍵,不返回其餘鍵,exclusion模式 指定不返回的鍵,返回其餘鍵。默認ID都返回。
兩種模式不可混用(由於這樣的話沒法推斷其餘鍵是否應返回),只能全1或全0,除了在inclusion模式時能夠指定_id爲0。

七 條件操做符

7.1 相關條件

操做
格式
範例
RDBMS中的相似語句
等於
{<key>:<value>}
db.col.find({"by":"中國"}).pretty()
where by = '中國'
小於
{<key>:{$lt:<value>}}
db.col.find({"likes":{$lt:50}}).pretty()
where likes < 50
小於或等於
{<key>:{$lte:<value>}}
db.col.find({"likes":{$lte:50}}).pretty()
where likes <= 50
大於
{<key>:{$gt:<value>}}
db.col.find({"likes":{$gt:50}}).pretty()
where likes > 50
大於或等於
{<key>:{$gte:<value>}}
db.col.find({"likes":{$gte:50}}).pretty()
where likes >= 50
不等於
{<key>:{$ne:<value>}}
db.col.find({"likes":{$ne:50}}).pretty()
where likes != 50
  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > db.age01.find({age: {$gt: '20'}}).pretty()
 
015
  1 > db.age01.find({age: {$gte: '15'}}).pretty()
016
  1 > db.age01.find({age: {$lt: '15'}}).pretty()
017
  1 > db.age01.find({age: {$lte: '15'}}).pretty()
018
  1 > db.age01.find({age: {$lt: '18',$gt: '10'}}).pretty()
019
模糊查詢
操做
格式
範例
包含
/<value>/
db.col.find({title:/zhangsan/})
以……開頭
/^<value>/
db.col.find({title:/^zhangsan/})
以……結尾
/<value>$/
db.col.find({title:/zhangsan$/})
  1 > db.age01.find({love: /apple/}).pretty()
020
  1 > db.age01.find({tel: /^188/}).pretty()
021
  1 > db.age01.find({tel: /88$/}).pretty()

八 MongoDB操做符

8.1 操做符

$type操做符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
MongoDB 中可使用的類型以下表所示:
類型
數字
備註
Double
1
 
String
2
 
Object
3
 
Array
4
 
Binary data
5
 
Undefined
6
已廢棄。
Object id
7
 
Boolean
8
 
Date
9
 
Null
10
 
Regular Expression
11
 
JavaScript
13
 
Symbol
14
 
JavaScript (with scope)
15
 
32-bit integer
16
 
Timestamp
17
 
64-bit integer
18
 
Min key
255
Query with -1.
Max key
127
 
  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > db.age01.find({tel: {$type: 2}}).pretty()
  4 > db.age01.find({tel: {$type: 'string'}}).pretty()
 

九 限定數量查詢

9.1 MongoDB Limit() 方法

若須要在MongoDB中讀取指定數量的數據記錄,可使用MongoDB的Limit方法,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。
語法格式:
  1 >db.COLLECTION_NAME.find().limit(NUMBER)
  2 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  3 > use mydb
  4 > db.age01.find({tel: /^188/}).limit(1).pretty()
 
022
提示:若沒有指定limit()方法中的參數則顯示集合中的全部數據。

9.2 MongoDB Skip() 方法

除了可使用limit()方法來讀取指定數量的數據外,還可使用skip()方法來跳過指定數量的數據,skip方法一樣接受一個數字參數做爲跳過的記錄條數。
語法格式:
  1 > db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
  2 > db.age01.find({love: /apple/}).pretty()
 
023
  1 > db.age01.find({love: /apple/}).limit(2).skip(1).pretty()
024
提示:skip默認爲跳過第一條數據。

十 MongoDB排序

10.1 MongoDB sort() 方法

在 MongoDB 中使用 sort() 方法對數據進行排序,sort() 方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而 -1 是用於降序排列。
語法格式:
  1 > db.COLLECTION_NAME.find().sort({KEY:1})
  2 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  3 > use mydb
  4 > db.age01.find().sort({age: 1}).pretty()
 
025
提示:skip(), limilt(), sort()一塊兒執行的時候,執行的順序是先 sort(), 而後是 skip(),最後是顯示的 limit()。

十一 其餘查詢技巧

11.1 查詢說明

  1 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin
  2 > use mydb
  3 > db.age01.find({},{name: 1, _id: 0}).limit(2)

說明:sql

第一個 {} 爲 where 條件,爲空表示返回集合中全部文檔。mongodb

第二個 {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)。數據庫

11.2 範圍讀取服務器

想要讀取從 10 條記錄後 100 條記錄,至關於 sql 中limit (10,100)。網絡

  1 > db.COLLECTION_NAME.find().skip(10).limit(100)

以上實例在集合中跳過前面 10 條返回 100 條數據。數據結構

提示:skip 和 limit 結合就能實現分頁。app

11.3 skip說明

kip和limit方法只適合小數據量分頁,若是是百萬級效率就會很是低,由於skip方法是一條條數據數過去的,建議使用where_limit。不要輕易使用Skip來作查詢,不然數據量大了就會致使性能急劇降低,這是由於Skip是一條一條的數過來的,多了天然就慢了。ide

11.4 語法優化

limit(n) 是用來規定顯示的條數,而 skip(n) 是用來在符合條件的記錄中從第一個記錄跳過的條數,這兩個函數能夠交換使用。函數

好比:find({},{age:1,_id:0}).limit(2).skip(1),在符合條件的文檔中,要顯示兩條文檔,顯示的位置從跳過第一條記錄開始。這樣不是很好理解。性能

若是寫成 find({},{age:1,_id:0}).skip(1).limit(2),在符合條件的文檔中,先跳過第一條文檔,而後顯示兩條文檔,這樣比較好理解。

注意:普通查詢skip,和limit三者執行順序和位置無關,可是在聚合aggregate中使用的時候,具備管道流的特質,執行順序是按照位置關係順序執行的。

十二 異常級別

  • WriteConcern.NONE:沒有異常拋出
  • WriteConcern.NORMAL:僅拋出網絡錯誤異常,沒有服務器錯誤異常
  • WriteConcern.SAFE:拋出網絡錯誤異常、服務器錯誤異常;並等待服務器完成寫操做。
  • WriteConcern.MAJORITY: 拋出網絡錯誤異常、服務器錯誤異常;並等待一個主服務器完成寫操做。
  • WriteConcern.FSYNC_SAFE: 拋出網絡錯誤異常、服務器錯誤異常;寫操做等待服務器將數據刷新到磁盤。
  • WriteConcern.JOURNAL_SAFE:拋出網絡錯誤異常、服務器錯誤異常;寫操做等待服務器提交到磁盤的日誌文件。
  • WriteConcern.REPLICAS_SAFE:拋出網絡錯誤異常、服務器錯誤異常;等待至少2臺服務器完成寫操做。

參考文檔:https://www.runoob.com/mongodb/

相關文章
相關標籤/搜索