《云计算》-MongoDB服务器:文档的增删改查详细操作

                <p>2 案例2:文档管理<br> 2.1 问题</p> 
基于MongoDB环境完成下列练习:
插入文档
查询文档
更新文档
删除文档

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:管理文档

1)把系统用户信息/etc/passwd存储到mdb库下的user集合里

rs1:PRIMARY> use mdb
switched to db mdb
rs1:PRIMARY> db.user.save({name:"yaya",password:"x",uid:9999,gid:9999,comment:"",homdir:"/home",shell:"/bin/bash"})
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> exit
bye
[root@mongodb52 ~]#  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
2018-09-29T11:04:14.967+0800    connected to: 192.168.4.52:27078
2018-09-29T11:04:14.968+0800    exported 1 record
[root@mongodb52 ~]#  cp /etc/passwd /tmp
[root@mongodb52 ~]# sed -i 's/:/,/g'   /tmp/passwd
[root@mongodb52 ~]#  sed -i '$r /tmp/passwd' /tmp/user.csv
[root@mongodb52 ~]# mongoimport --host 192.168.4.52 --port 27078 -d mdb -c user --headerline  --type=csv  /tmp/user.csv
2018-09-29T11:06:08.355+0800    connected to: 192.168.4.52:27078
2018-09-29T11:06:08.363+0800    imported 41 documents

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2)查看

[root@mongodb52 ~]# mongo --host 192.168.4.52 --port 27078
rs1:PRIMARY> use mdb
switched to db mdb
rs1:PRIMARY> db.user.findOne()
{
    "_id" : ObjectId("5baeeb37ce3cc5539aa21f38"),
    "name" : "yaya",
    "password" : "x",
    "uid" : 9999,
    "gid" : 9999,
    "comment" : "",
    "homdir" : "/home",
    "shell" : "/bin/bash"
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

db.user.find({条件},{定义显示的字段}) #指定查询条件并指定显示的字段

rs1:PRIMARY> db.user.find()
{ "_id" : ObjectId("5baeeb37ce3cc5539aa21f38"), "name" : "yaya", "password" : "x", "uid" : 9999, "gid" : 9999, "comment" : "", "homdir" : "/home", "shell" : "/bin/bash" }
...
Type "it" for more            //出现这个按it,默认出现20行

 
 
  • 1
  • 2
  • 3
  • 4

查看每行的name字段

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

不看_id字段

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查看以a开头的name字段

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

 
 
  • 1
  • 2
  • 3
  • 4

显示查询结果的前一行

limit 数字

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

 
 
  • 1
  • 2

显示name字段以a开头的第一行

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

 
 
  • 1
  • 2

跳过几行显示 (2行)

skip 数字

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

 
 
  • 1
  • 2

默认升序排序

sort 字段名

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

 
 
  • 1
  • 2
  • 3
  • 4

降序排序

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

 
 
  • 1
  • 2
  • 3
  • 4

显示name字段以a开头和uid为3的所有行

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

 
 
  • 1
  • 2

3)条件判断的表示方式

$in 在…里

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

 
 
  • 1
  • 2
  • 3

$nin 不在…里

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

$or 条件满足任意其中一个即可

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

 
 
  • 1
  • 2
  • 3

4)正则匹配,以a开头的name字段

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

 
 
  • 1
  • 2
  • 3
  • 4

5)数值比较

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

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

匹配null:可以匹配没有的字段,也可以检查这个字段有没有

rs1:PRIMARY> db.user.save({name:null,uid:null})
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.user.find({name:null})
{ "_id" : ObjectId("5baef385f9f3bf625ea1dbd6"), "name" : null, "uid" : null }
rs1:PRIMARY>  db.user.find({shell:null})    //表示此条文档没有shell字段
{ "_id" : ObjectId("5baef385f9f3bf625ea1dbd6"), "name" : null, "uid" : null }
rs1:PRIMARY>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6)save和insert的区别

相同点:当集合不存在时创建集合,并插入记录

不同点:save() _id字段值已经存在时,修改文档字段值

insert() _id字段值已经存在时,放弃修改文档字段值

rs1:PRIMARY> db.t1.save({name:"bob",age:19})
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.t1.insert({name:"bob",age:19})
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.t1.save({_id:7,name:"bob",age:19})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 7 })
rs1:PRIMARY>  db.t1.find()
...
...
{ "_id" : 7, "name" : "bob", "age" : 19 }
rs1:PRIMARY> db.t1.save({_id:7,name:"tom",age:19})        //把上一条的记录直接修改
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.t1.find()
...
...
{ "_id" : 7, "name" : "tom", "age" : 19 }
rs1:PRIMARY>
rs1:PRIMARY> 
rs1:PRIMARY> db.t1.insert({_id:8,name:"tom",age:19})        //可以存上
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.t1.insert({_id:8,name:"tom",age:19})        //存不上
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: mdb.t1 index: _id_ dup key: { : 8.0 }"
    }
})

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

7)插入多行文档

rs1:PRIMARY> db.t1.insertMany([{name:"xiaojiu"},{name:"laoshi"}])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5baef526f9f3bf625ea1dbd9"),
        ObjectId("5baef526f9f3bf625ea1dbda")
    ]
}
rs1:PRIMARY> db.t1.find()
...
...
{ "_id" : ObjectId("5baef526f9f3bf625ea1dbd9"), "name" : "xiaojiu" }
{ "_id" : ObjectId("5baef526f9f3bf625ea1dbda"), "name" : "laoshi" }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

8)update修改

rs1:PRIMARY> db.user.update({name:"root"},{password:"XXX"})  
//如果这一列不写完整,这一行除了password这一行,这一列的其他值都没有了相当于删除(要写完整)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.t1.find({name:"root"})
rs1:PRIMARY> db.user.find({name:"root"})   //没有东西,除了password:"XXX"

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

9)$set 条件匹配时,修改指定字段的值(局部修改)

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

10)$unset 删除与条件匹配文档的字段

rs1:PRIMARY> db.user.update({name:"sync"},{$unset:{password:1}})     
//删除password字段
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

 
 
  • 1
  • 2
  • 3

11)数组

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

 
 
  • 1
  • 2

$pop 删除数组末尾一个元素,1删除最后一个,-1删除第一个

rs1:PRIMARY> db.user.update({name:"bob"},{$pop:{like:1}})    
//删除匹配的第一条的最后一个
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.user.update({name:"bob"},{$pop:{like:-1}})    
//删除匹配的第一条的第一个
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

$push 向数组中添加新元素

rs1:PRIMARY> db.user.update({name:"bob"},{$push:{like:"Z"}})        //默认添加到最后
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.user.update({name:"bob"},{$push:{like:"W"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.user.find({name:"bob"})
{ "_id" : ObjectId("5baef7b2034891a205de2959"), "name" : "bob", "like" : [ "b", "c", "d", "e", "Z", "W" ] }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

$addToSet 避免重复添加

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

 
 
  • 1
  • 2
  • 3
  • 4

$pull 删除数组里的指定元素,若有两个bob可以用_id值定义把name:"bob"换成id值

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

$inc 条件匹配时,字段值自加或自减

rs1:PRIMARY> db.user.update({uid:{$lte:10}},{$inc:{uid:2}})         
//设置字段值自加2,默认改第一行
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   
rs1:PRIMARY> db.user.update({uid:{$lte:10}},{$inc:{uid:2}},false,true)    
//设置字段值自加2,false,true改全部
WriteResult({ "nMatched" : 8, "nUpserted" : 0, "nModified" : 8 })   
rs1:PRIMARY>
rs1:PRIMARY> db.user.update({uid:{$lte:10}},{$inc:{uid:-1}})    
//负数时是自减1,默认改第一行
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

12)删除文档

remove()与drop()的区别

remove()删除文档时不删除索引

drop()删除集合的时候同时删除索引

rs1:PRIMARY> db.t1.remove({})
WriteResult({ "nRemoved" : 6 })
rs1:PRIMARY> db.user.remove({name:"/^a/"})        //删除以a开头的记录
WriteResult({ "nRemoved" : 0 })
rs1:PRIMARY> db.t1.drop()        //删除集合t1
true
rs1:PRIMARY>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹汇川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值