1. 程式人生 > >05: MongoDB副本集 MongoDB文件管理

05: MongoDB副本集 MongoDB文件管理

Top

NSD NOSQL DAY05

1 案例1:配置MongoDB副本集

1.1 問題

  • 具體要求:
  • 準備3臺mongodb伺服器
  • 配置副本集服務
  • 驗證副本集配置

1.2 方案

準備三臺虛擬機器,配置mongodb副本集,ip分別為192.158.4.51, 192.168.4.52,192.168.4.53其中一個是主節點,負責處理客戶端請求,其餘的都是從節點,負責複製主節點上的資料,實現儲存資料副本,提高了資料的可用性,具體分配如表-1所示:

表-1

1.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:建立mongodb副本集

1)三臺主機安裝mongodb(以4.51為例)

  1. [[email protected] ~]# cd mongodb/
  2. [[email protected] mongodb]# mkdir /usr/local/mongodb
  3. [[email protected] mongodb]# cd /usr/local/mongodb
  4. [[email protected] mongodb]# cp -r \
  5. /root/mongodb/mongodb-linux-x86_64-rhel70-3.6.3/bin/ .
  6. [[email protected] mongodb]# ls
  7. bin
  8. [[email protected]
    mongodb]# mkdir etc
  9. [[email protected] mongodb]# mkdir log
  10. [[email protected] mongodb]# mkdir -p data/db
  11. [[email protected] mongodb]# vim etc/mongodb.conf
  12. dbpath=/usr/local/mongodb/data/db/
  13. logpath=/usr/local/mongodb/log/mongodb.log
  14. logappend=true
  15. fork=true
  16. bind_ip=192.168.4.51
  17. port=27077
  18. replSet=rs1        
  19. //加入到副本集,rs1名字隨便起,想知道誰和我在一個副本集裡,三臺機器的名字一樣,都寫rs1

2)設定PATH變數

  1. [[email protected] mongodb]# vim /etc/profile
  2. export PATH=/usr/local/mongodb/bin:$PATH
  3. [[email protected] mongodb]# source /etc/profile

3)由於啟動和停止服務名字太長,可以起一個別名

給停止服務起一個別名

  1. [[email protected] mongodb]# alias cmdb='mongod --dbpath=/usr/local/mongodb/data/db/ --shutdown'

給啟動服務起一個別名

  1. [[email protected] mongodb]# alias smdb='mongod -f /usr/local/mongodb/etc/mongodb.conf'

4)啟動服務並連線

  1. [[email protected] ~]# smdb
  2. about to fork child process, waiting until server is ready for connections.
  3. forked process: 5656
  4. child process started successfully, parent exiting
  5. [[email protected] ~]# mongo --host 192.168.4.51 --port 27077
  6. MongoDB shell version v3.6.3
  7. connecting to: mongodb://192.168.4.51:27077/
  8. MongoDB server version: 3.6.3
  9. ...
  10. >

5)配置叢集資訊,任意一臺都可以,在這裡在51上面操作

  1. > rs1_config = {        //rs1_config隨便起變數名,要記住
  2. _id:"rs1",         //必須為rs1這個,三臺主機叢集名,配置檔案裡面寫的是這個
  3. members:[
  4. {_id:0,host:"192.168.4.51:27077"},        //_id值隨意,host值固定
  5. {_id:1,host:"192.168.4.52:27078"},
  6. {_id:2,host:"192.168.4.53:27079"}
  7. ]
  8. };        //回車,出現下面情況為成功
  9. {
  10.     "_id" : "rs1",
  11.     "members" : [
  12.         {
  13.             "_id" : 0,
  14.             "host" : "192.168.4.51:27077"
  15.         },
  16.         {
  17.             "_id" : 1,
  18.             "host" : "192.168.4.52:27078"
  19.         },
  20.         {
  21.             "_id" : 2,
  22.             "host" : "192.168.4.53:27079"
  23.         }
  24.     ]
  25. }
  26. >

6)初始化Replica Sets環境

  1. > rs.initiate(rs1_config)
  2. {
  3.     "ok" : 1,
  4.     "operationTime" : Timestamp(1538187475, 1),
  5.     "$clusterTime" : {
  6.         "clusterTime" : Timestamp(1538187475, 1),
  7.         "signature" : {
  8.             "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
  9.             "keyId" : NumberLong(0)
  10.         }
  11.     }
  12. }
  13. rs1:SECONDARY>
  14. rs1:PRIMARY>            //提示PRIMARY,51為主

7)在52和53上面檢視

  1. [[email protected] ~]# mongo --host 192.168.4.52 --port 27078
  2. MongoDB shell version v3.6.3
  3. connecting to: mongodb://192.168.4.52:27078/
  4. MongoDB server version: 3.6.3
  5. ...
  6. ...
  7. rs1:SECONDARY>         //提示SECONDARY,52為從
  8. rs1:SECONDARY>
  9. rs1:SECONDARY>
  10. [[email protected] ~]# mongo --host 192.168.4.53 --port 27079
  11. MongoDB shell version v3.6.3
  12. connecting to: mongodb://192.168.4.53:27079/
  13. MongoDB server version: 3.6.3
  14. ...
  15. ...
  16. rs1:SECONDARY>     //提示SECONDARY,53為從
  17. rs1:SECONDARY>

注意:如果初始化錯誤,重啟服務登陸之後重新設定變數,之後再重新初始化

8)檢視狀態資訊

  1. rs1:PRIMARY> rs.status()
  2. ...
  3.     "members" : [
  4.         {
  5.             "_id" : 0,
  6.             "name" : "192.168.4.51:27077",
  7.             "health" : 1,
  8.             "state" : 1,
  9.             "stateStr" : "PRIMARY",
  10.             "uptime" : 2295,
  11.             ...
  12. ...
  13.         },
  14.         {
  15.             "_id" : 1,
  16.             "name" : "192.168.4.52:27078",
  17.             "health" : 1,
  18.             "state" : 2,
  19.             "stateStr" : "SECONDARY",
  20.             "uptime" : 384,
  21.             ...
  22. ...
  23.         },
  24.         {
  25.             "_id" : 2,
  26.             "name" : "192.168.4.53:27079",
  27.             "health" : 1,
  28.             "state" : 2,
  29.             "stateStr" : "SECONDARY",
  30. ...
  31. ...

9)檢視是否是master庫

  1. rs1:PRIMARY> rs .isMaster( )
  2. {
  3.     "hosts" : [
  4.         "192.168.4.51:27077",
  5.         "192.168.4.52:27078",
  6.         "192.168.4.53:27079"
  7.     ],
  8.     "setName" : "rs1",
  9.     "setVersion" : 1,
  10.     "ismaster" : true,        //主庫
  11.     "secondary" : false,
  12.     "primary" : "192.168.4.51:27077",
  13.     "me" : "192.168.4.51:27077",
  14. ...
  15. ...

10)驗證副本集,同步資料驗證(51上面寫資料)

  1. rs1:PRIMARY> use gamedb2
  2. switched to db gamedb2
  3. rs1:PRIMARY> db.a.save({name:"yaya",age:75,em:"[email protected]"})
  4. WriteResult({ "nInserted" : 1 })

52上面檢視

  1. [[email protected] ~]# mongo --host 192.168.4.52 --port 27078
  2. rs1:SECONDARY> db.getMongo().setSlaveOk()
  3. rs1:SECONDARY> show dbs        //有gamedb2庫
  4. admin 0.000GB
  5. config 0.000GB
  6. ddsdb 0.000GB
  7. gamedb2 0.000GB
  8. local 0.000GB
  9. test 0.000GB

步驟三:切換主庫驗證

1)自動切換主庫驗證

關閉51

  1. [[email protected] ~]# cmdb        //之前設定的別名
  2. killing process with pid: 5656

檢視52和53

  1. [[email protected] ~]# mongo --host 192.168.4.52 --port 27078
  2. MongoDB shell version v3.6.3
  3. connecting to: mongodb://192.168.4.52:27078/
  4. MongoDB server version: 3.6.3
  5. ...
  6. ...
  7. rs1:PRIMARY>         //52為主
  8. rs1:PRIMARY>
  9. [[email protected] ~]# mongo --host 192.168.4.53 --port 27079
  10. MongoDB shell version v3.6.3
  11. connecting to: mongodb://192.168.4.53:27079/
  12. MongoDB server version: 3.6.3
  13. ...
  14. ...
  15. rs1:SECONDARY>        //53為從

啟動51,啟動後不會再變為主,會成為52的從

  1. [[email protected] ~]# smdb
  2. about to fork child process, waiting until server is ready for connections.
  3. forked process: 6598
  4. child process started successfully, parent exiting
  5. rs1:SECONDARY> rs.isMaster()
  6. {
  7.     "hosts" : [
  8.         "192.168.4.51:27077",
  9.         "192.168.4.52:27078",
  10.         "192.168.4.53:27079"
  11.     ],
  12.     "setName" : "rs1",
  13.     "setVersion" : 1,
  14.     "ismaster" : false,
  15.     "secondary" : true,
  16.     "primary" : "192.168.4.52:27078",
  17.     "me" : "192.168.4.51:27077",
  18. ...

2 案例2:文件管理

2.1 問題

  • 基於MongoDB環境完成下列練習:
  • 插入文件
  • 查詢文件
  • 更新文件
  • 刪除文件

2.2 步驟

實現此案例需要按照如下步驟進行。

步驟一:管理文件

1)把系統使用者資訊/etc/passwd儲存到mdb庫下的user集合裡

  1. rs1:PRIMARY> use mdb
  2. switched to db mdb
  3. rs1:PRIMARY> db.user.save({name:"yaya",password:"x",uid:9999,gid:9999,comment:"",homdir:"/home",shell:"/bin/bash"})
  4. WriteResult({ "nInserted" : 1 })
  5. rs1:PRIMARY> exit
  6. bye
  7. [[email protected] ~]# mongoexport --host 192.168.4.52 --port 27078 -d mdb -c user -f name,password,uid,gid,comment,homdir,shell --type=csv -o /tmp/user.csv
  8. 2018-09-29T11:04:14.967+0800    connected to: 192.168.4.52:27078
  9. 2018-09-29T11:04:14.968+0800    exported 1 record
  10. [[email protected] ~]# cp /etc/passwd /tmp
  11. [[email protected] ~]# sed -i 's/:/,/g' /tmp/passwd
  12. [[email protected] ~]# sed -i '$r /tmp/passwd' /tmp/user.csv
  13. [[email protected] ~]# mongoimport --host 192.168.4.52 --port 27078 -d mdb -c user --headerline --type=csv /tmp/user.csv
  14. 2018-09-29T11:06:08.355+0800    connected to: 192.168.4.52:27078
  15. 2018-09-29T11:06:08.363+0800    imported 41 documents

2)檢視

  1. [[email protected] ~]# mongo --host 192.168.4.52 --port 27078
  2. rs1:PRIMARY> use mdb
  3. switched to db mdb
  4. rs1:PRIMARY> db.user.findOne()
  5. {
  6.     "_id" : ObjectId("5baeeb37ce3cc5539aa21f38"),
  7.     "name" : "yaya",
  8.     "password" : "x",
  9.     "uid" : 9999,
  10.     "gid" : 9999,
  11.     "comment" : "",
  12.     "homdir" : "/home",
  13.     "shell" : "/bin/bash"
  14. }

db.user.find({條件},{定義顯示的欄位}) #指定查詢條件並指定顯示的欄位

  1. rs1:PRIMARY> db.user.find()
  2. { "_id" : ObjectId("5baeeb37ce3cc5539aa21f38"), "name" : "yaya", "password" : "x", "uid" : 9999, "gid" : 9999, "comment" : "", "homdir" : "/home", "shell" : "/bin/bash" }
  3. ...
  4. Type "it" for more            //出現這個按it,默認出現20行

檢視每行的name欄位

  1. rs1:PRIMARY> db.user.find({},{name:1})        
  2. { "_id" : ObjectId("5baeeb37ce3cc5539aa21f38"), "name" : "yaya" }
  3. ...
  4. ...
  5. { "_id" : ObjectId("5baeec2001805180a1011843"), "name" : "rpc" }
  6. Type "it" for more

不看_id欄位

  1. rs1:PRIMARY> db.user.find({},{_id:0})
  2. { "name" : "yaya", "password" : "x", "uid" : 9999, "gid" : 9999, "comment" : "", "homdir" : "/home", "shell" : "/bin/bash" }
  3. ...
  4. ...
  5. { "name" : "rpc", "password" : "x", "uid" : 32, "gid" : 32, "comment" : "Rpcbind Daemon", "homdir" : "/var/lib/rpcbind", "shell" : "/sbin/nologin" }
  6. Type "it" for more

不看_id那一列,看name那一列

  1. rs1:PRIMARY> db.user.find({},{_id:0,name:1})
  2. { "name" : "yaya" }
  3. ...
  4. ...
  5. { "name" : "rpc" }
  6. Type "it" for more

檢視以a開頭的name欄位

  1. rs1:PRIMARY> db.user.find({name:/^a/},{_id:0})
  2. { "name" : "adm", "password" : "x", "uid" : 3, "gid" : 4, "comment" : "adm", "homdir" : "/var/adm", "shell" : "/sbin/nologin" }
  3. { "name" : "abrt", "password" : "x", "uid" : 173, "gid" : 173, "comment" : "", "homdir" : "/etc/abrt", "shell" : "/sbin/nologin" }
  4. { "name" : "avahi", "password" : "x", "uid" : 70, "gid" : 70, "comment" : "Avahi mDNS/DNS-SD Stack", "homdir" : "/var/run/avahi-daemon", "shell" : "/sbin/nologin" }

顯示查詢結果的前一行

limit 數字

  1. rs1:PRIMARY> db.user.find({name:/^a/},{_id:0}).limit (1)
  2. { "name" : "adm", "password" : "x", "uid" : 3, "gid" : 4, "comment" : "adm", "homdir" : "/var/adm", "shell" : "/sbin/nologin" }

顯示name欄位以a開頭的第一行

  1. rs1:PRIMARY> db.user.findOne({name:/^a/},{_id:0,name:1,shell:1,uid:1})
  2. { "name" : "adm", "uid" : 3, "shell" : "/sbin/nologin" }

跳過幾行顯示 (2行)

skip 數字

  1. rs1:PRIMARY> db.user.find({name:/^a/},{_id:0,name:1,shell:1}).skip (2)
  2. { "name" : "avahi", "shell" : "/sbin/nologin" }

預設升序排序

sort 欄位名

  1. rs1:PRIMARY> db.user.find({name:/^a/},{_id:0,name:1,shell:1,uid:1}).sort({uid:1})
  2. { "name" : "adm", "uid" : 3, "shell" : "/sbin/nologin" }
  3. { "name" : "avahi", "uid" : 70, "shell" : "/sbin/nologin" }
  4. { "name" : "abrt", "uid" : 173, "shell" : "/sbin/nologin" }

降序排序

  1. rs1:PRIMARY> db.user.find({name:/^a/},{_id:0,name:1,shell:1,uid:1}).sort({uid:-1})
  2. { "name" : "abrt", "uid" : 173, "shell" : "/sbin/nologin" }
  3. { "name" : "avahi", "uid" : 70, "shell" : "/sbin/nologin" }
  4. { "name" : "adm", "uid" : 3, "shell" : "/sbin/nologin" }

顯示name欄位以a開頭和uid為3的所有行

  1. rs1:PRIMARY> db.user.find({name:/^a/,uid:3},{_id:0,name:1,shell:1,uid:1})
  2. { "name" : "adm", "uid" : 3, "shell" : "/sbin/nologin" }

3)條件判斷的表示方式

$in 在...裡

  1. rs1:PRIMARY> db.user.find({uid:{$in:[1,6,9]}})        //uid的為1或者6或者9的匹配
  2. { "_id" : ObjectId("5baeec2001805180a1011833"), "name" : "bin", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "bin", "homdir" : "/bin", "shell" : "/sbin/nologin" }
  3. { "_id" : ObjectId("5baeec2001805180a1011838"), "name" : "shutdown", "password" : "x", "uid" : 6, "gid" : 0, "comment" : "shutdown", "homdir" : "/sbin", "shell" : "/sbin/shutdown" }

$nin 不在...裡

  1. rs1:PRIMARY> db.user.find({uid:{$nin:[1,6,9]}},{_id:0,name:1,uid:1})
  2. { "name" : "yaya", "uid" : 9999 }
  3. ...
  4. ...
  5. { "name" : "saslauth", "uid" : 996 }
  6. Type "it" for more

$or 條件滿足任意其中一個即可

  1. rs1:PRIMARY> db.user.find({$or:[{name:"root"},{uid:1}]},{_id:0,name:1,uid:1})
  2. { "name" : "root", "uid" : 0 }
  3. { "name" : "bin", "uid" : 1 }

4)正則匹配,以a開頭的name欄位

  1. rs1:PRIMARY> db.user.find({name:/^a/},{_id:0,name:1,uid:1})
  2. { "name" : "adm", "uid" : 3 }
  3. { "name" : "abrt", "uid" : 173 }
  4. { "name" : "avahi", "uid" : 70 }

5)數值比較

$lt(小於) $lte(小於等於) $gt(大於) $gte(大於等於) $ne(不等於)

  1. rs1:PRIMARY> db.user.find({uid:{$gte:10,$lte:40}},{_id:0,name:1,uid:1})
  2. { "name" : "operator", "uid" : 11 }
  3. { "name" : "games", "uid" : 12 }
  4. { "name" : "ftp", "uid" : 14 }
  5. { "name" : "rpc", "uid" : 32 }
  6. { "name" : "rpcuser", "uid" : 29 }
  7. { "name" : "ntp", "uid" : 38 }

匹配null:可以匹配沒有的欄位,也可以檢查這個欄位有沒有

  1. rs1:PRIMARY> db.user.save({name:null,uid:null})
  2. WriteResult({ "nInserted" : 1 })
  3. rs1:PRIMARY> db.user.find({name:null})
  4. { "_id" : ObjectId("5baef385f9f3bf625ea1dbd6"), "name" : null, "uid" : null }
  5. rs1:PRIMARY> db.user.find({shell:null})    //表示此條文件沒有shell欄位
  6. { "_id" : ObjectId("5baef385f9f3bf625ea1dbd6"), "name" : null, "uid" : null }
  7. rs1:PRIMARY>

6)save和insert的區別

相同點:當集合不存在時建立集合,並插入記錄

不同點:save() _id欄位值已經存在時,修改文件欄位值

insert() _id欄位值已經存在時,放棄修改文件欄位值

  1. rs1:PRIMARY> db.t1.save({name:"bob",age:19})
  2. WriteResult({ "nInserted" : 1 })
  3. rs1:PRIMARY> db.t1.insert({name:"bob",age:19})
  4. WriteResult({ "nInserted" : 1 })
  5. rs1:PRIMARY> db.t1.save({_id:7,name:"bob",age:19})
  6. WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 7 })
  7. rs1:PRIMARY> db.t1.find()
  8. ...
  9. ...
  10. { "_id" : 7, "name" : "bob", "age" : 19 }
  11. rs1:PRIMARY> db.t1.save({_id:7,name:"tom",age:19})        //把上一條的記錄直接修改
  12. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  13. rs1:PRIMARY> db.t1.find()
  14. ...
  15. ...
  16. { "_id" : 7, "name" : "tom", "age" : 19 }
  17. rs1:PRIMARY>
  18. rs1:PRIMARY>
  19. rs1:PRIMARY> db.t1.insert({_id:8,name:"tom",age:19})        //可以存上
  20. WriteResult({ "nInserted" : 1 })
  21. rs1:PRIMARY> db.t1.insert({_id:8,name:"tom",age:19})        //存不上
  22. WriteResult({
  23.     "nInserted" : 0,
  24.     "writeError" : {
  25.         "code" : 11000,
  26.         "errmsg" : "E11000 duplicate key error collection: mdb.t1 index: _id_ dup key: { : 8.0 }"
  27.     }
  28. })

7)插入多行文件

  1. rs1:PRIMARY> db.t1.insertMany([{name:"xiaojiu"},{name:"laoshi"}])
  2. {
  3.     "acknowledged" : true,
  4.     "insertedIds" : [
  5.         ObjectId("5baef526f9f3bf625ea1dbd9"),
  6.         ObjectId("5baef526f9f3bf625ea1dbda")
  7.     ]
  8. }
  9. rs1:PRIMARY> db.t1.find()
  10. ...
  11. ...
  12. { "_id" : ObjectId("5baef526f9f3bf625ea1dbd9"), "name" : "xiaojiu" }
  13. { "_id" : ObjectId("5baef526f9f3bf625ea1dbda"), "name" : "laoshi" }

8)update修改

  1. rs1:PRIMARY> db.user.update({name:"root"},{password:"XXX"})
  2. //如果這一列不寫完整,這一行除了password這一行,這一列的其他值都沒有了相當於刪除(要寫完整)
  3. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  4. rs1:PRIMARY> db.t1.find({name:"root"})
  5. rs1:PRIMARY> db.user.find({name:"root"}) //沒有東西,除了password:"XXX"

9)$set 條件匹配時,修改指定欄位的值(區域性修改)

  1. rs1:PRIMARY> db.user.update({name:"adm"},{$set:{password:"AAA"}})
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  3. rs1:PRIMARY> db.user.find({name:"adm"})        //還存在
  4. { "_id" : ObjectId("5baeec2001805180a1011835"), "name" : "adm", "password" : "AAA", "uid" : 3, "gid" : 4, "comment" : "adm", "homdir" : "/var/adm", "shell" : "/sbin/nologin" }
  5. rs1:PRIMARY> db.user.update({name:/^r/},{$set:{password:"FFF"}})        
  6. //預設修改匹配條件的第一行
  7. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })    
  8. rs1:PRIMARY> db.user.update({name:/^a/},{$set:{password:"FFF"}},false,true)
  9. //改匹配到的所有
  10. WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

10)$unset 刪除與條件匹配文件的欄位

  1. rs1:PRIMARY> db.user.update({name:"sync"},{$unset:{password:1}})     
  2. //刪除password欄位
  3. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

11)陣列

  1. rs1:PRIMARY> db.user.insert({name:"bob",like:["a","b","c","d","e","f",]})
  2. WriteResult({ "nInserted" : 1 })

$pop 刪除陣列末尾一個元素,1刪除最後一個,-1刪除第一個

  1. rs1:PRIMARY> db.user.update({name:"bob"},{$pop:{like:1}})    
  2. //刪除匹配的第一條的最後一個
  3. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  4. rs1:PRIMARY> db.user.update({name:"bob"},{$pop:{like:-1}})    
  5. //刪除匹配的第一條的第一個
  6. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

$push 向陣列中新增新元素

  1. rs1:PRIMARY> db.user.update({name:"bob"},{$push:{like:"Z"}})        //預設新增到最後
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  3. rs1:PRIMARY> db.user.update({name:"bob"},{$push:{like:"W"}})
  4. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  5. rs1:PRIMARY> db.user.find({name:"bob"})
  6. { "_id" : ObjectId("5baef7b2034891a205de2959"), "name" : "bob", "like" : [ "b", "c", "d", "e", "Z", "W" ] }

$addToSet 避免重複新增

  1. rs1:PRIMARY> db.user.update({name:"bob"},{$addToSet:{like:"W"}})
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
  3. rs1:PRIMARY> db.user.find({name:"bob"})
  4. { "_id" : ObjectId("5baef7b2034891a205de2959"), "name" : "bob", "like" : [ "b", "c", "d", "e", "Z", "W" ] }

$pull 刪除數組裡的指定元素,若有兩個bob可以用_id值定義把name:"bob"換成id值

  1. rs1:PRIMARY> db.user.update({name:"bob"},{$pull:{like:"c"}})
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  3. rs1:PRIMARY> db.user.find({name:"bob"})
  4. { "_id" : ObjectId("5baef7b2034891a205de2959"), "name" : "bob", "like" : [ "b", "d", "e", "Z", "W" ] }
  5. rs1:PRIMARY> db.user.update({"_id":ObjectId("5afc1a717eff45e9cfc57ed3")},{$push:{like:"S"}})
  6. WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
  7. rs1:PRIMARY>

$inc 條件匹配時,欄位值自加或自減

  1. rs1:PRIMARY> db.user.update({uid:{$lte:10}},{$inc:{uid:2}})         
  2. //設定欄位值自加2,預設改第一行
  3. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  4. rs1:PRIMARY> db.user.update({uid:{$lte:10}},{$inc:{uid:2}},false,true)    
  5. //設定欄位值自加2,false,true改全部
  6. WriteResult({ "nMatched" : 8, "nUpserted" : 0, "nModified" : 8 })
  7. rs1:PRIMARY>
  8. rs1:PRIMARY> db.user.update({uid:{$lte:10}},{$inc:{uid:-1}})
  9. //負數時是自減1,預設改第一行
  10. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

12)刪除文件

remove()與drop()的區別

remove()刪除文件時不刪除索引

drop()刪除集合的時候同時刪除索引

  1. rs1:PRIMARY> db.t1.remove({})
  2. WriteResult({ "nRemoved" : 6 })
  3. rs1:PRIMARY> db.user.remove({name:"/^a/"})        //刪除以a開頭的記錄
  4. WriteResult({ "nRemoved" : 0 })
  5. rs1:PRIMARY> db.t1.drop()        //刪除集合t1
  6. true
  7. rs1:PRIMARY>