数据库基础之15(配置Replica Sets副本集(集群)、集合的管理(增删改查))

目录

 1、配置Replica Sets副本集

2、集合的管理(增删改查)

2-1、插入文档(增)

2-2、查询文档(查)

2-3、更新文档(改)

2-4、删除文档


 
1、配置Replica Sets副本集(集群)

  1. 启动MongoDB服务
  2. 指定副本集(集群)名称
  3. 配置节点信息
  4. 查看副本集信息
  5. 验证副本集配置

mongod  -f   /usr/local/mongodb/etc/mongodb.conf---------启动MongoDB服务

vim /usr/local/mongodb/etc/mongodb.conf
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
dbpath=/usr/local/mongodb/data/db
fork=true
bind_ip=192.168.4.51
port=27051
replSet=rs1----------指定副本集(集群)名称

 config = { _id:"rs1",members:[ {_id:0,host:"192.168.4.51:27051"},{_id:1,host:"192.168.4.52:27052"},{_id:2,host:"192.168.4.53:27053"} ]}-------------配置节点信息

rs1:PRIMARY> rs.initiate(config)----初始化replica sets环境
 
rs1:PRIMARY> rs.status()-----查看集群状态
 
rs1:PRIMARY> rs.isMaster()-----查看谁是主库
 
db.getMongo().setSlaveOk()-----给查询权限

mongod -f /usr/local/mongodb/etc/mongodb.conf --shutdown-------模拟主库宕机,会发现另外的从库很快会竞选出新的从库

集群竞选主库的过程:

  1. 几个从库会每隔两秒(heartbeatIntervalMillis" : NumberLong(2000))轮询检查主库的状态,当从库a发现主库宕机后,会提请自己做新的主库
  2. 从库b会先确认一下主库是否已经宕机,确认主库确实宕机后,会检查从库a的数据是否比自己新
  3. 若比自己数据新,会再检查是否比其它从库的数据也新,若如此,才会让a从库当新的主库

###################################################################################

2、集合的管理(增删改查)

2-1、插入文档(增)

Save()
• 格式
– db.集合名.save({ key:“值”,key:”值”})
• 注意
– 集合不存在时创建集合,然后后插入记录
_id字段值 已存在时 修改文档字段值
– _id字段值 不已存在时 插入文档
实例:
rs1:PRIMARY> use userdb
switched to db userdb
rs1:PRIMARY> db.a1.save({_id:"xyz",name:"jack"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "xyz" })
rs1:PRIMARY> db.a1.save({_id:"XYZ",name:"jack"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "XYZ" })
rs1:PRIMARY> db.a1.find()
{ "_id" : "xyz", "name" : "jack" }
{ "_id" : "XYZ", "name" : "jack" }
rs1:PRIMARY> db.a1.save({_id:"xyz",name:"harry"})----------_id字段值 已存在时 修改文档字段值
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.a1.find()
{ "_id" : "xyz", "name" : "harry" }
{ "_id" : "XYZ", "name" : "jack" }
 
Insert()
• 格式
– db.集合名.insert({key:“值”,key:”值”})
• 注意
– 集合不存在时创建集合,然后后插入记录
_id字段值 已存在时放弃插入
– _id字段值 不已存在时 插入文档
实例:
rs1:PRIMARY> db.a1.insert({_id:"xyz",name:"haha"})
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: userdb.a1 index: _id_ dup key: { : \"xyz\" }"---_id字段值 已存在时放弃插入
    }
})
rs1:PRIMARY> db.a1.find()
{ "_id" : "xyz", "name" : "harry" }
{ "_id" : "XYZ", "name" : "jack" }

InsertMany()
• 插入多条记录
实例:
rs1:PRIMARY> db.a2.insertMany(
... [
... {name:"bob",age:19,email:"[email protected]"},
... {naem:"lucy",sex:"girl"},
... {name:"bob",school:"juren",class:5}
... ]
... )----回车
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5b62a4660c4f4bedcf36b479"),
        ObjectId("5b62a4660c4f4bedcf36b47a"),
        ObjectId("5b62a4660c4f4bedcf36b47b")
    ]
}
rs1:PRIMARY> db.a2.find()
{ "_id" : ObjectId("5b62a4660c4f4bedcf36b479"), "name" : "bob", "age" : 19, "email" : "[email protected]" }
{ "_id" : ObjectId("5b62a4660c4f4bedcf36b47a"), "naem" : "lucy", "sex" : "girl" }
{ "_id" : ObjectId("5b62a4660c4f4bedcf36b47b"), "name" : "bob", "school" : "juren", "class" : 5 }


2-2、查询文档(查)

查询语法
• 显示所有行,默认一次只输出20 行 输入it 显示后续的行
– db.集合名.find()
• 显示第1行
– > db.集合名.findOne()
• 指定查询条件并指定显示的字段
– > db.集合名.find({条件},{定义显示的字段})
– > db.user.find({},{_id:0,name:1,shell:1})-------– 0 不显示 1 显示,因为_id 是默认显示的,故要不显示则需_id:0
实例:
rs1:PRIMARY> db.user.find({name:"root"},{_id:0,name:1,uid:1})
{ "name" : "root", "uid" : 0 }
 
行数限制
• limit(数字) //显示前几行
– > db.集合名.find().limit(3)
rs1:PRIMARY> db.user.find().limit(3)
{ "_id" : ObjectId("5b617821e4ffddd428c72ab2"), "name" : "yaya", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "", "homedir" : "/home/yaya", "shell" : "/bin/bash" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab3"), "name" : "root", "password" : "x", "uid" : 0, "gid" : 0, "comment" : "root", "homedir" : "/root", "shell" : "/bin/bash" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab4"), "name" : "bin", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "bin", "homedir" : "/bin", "shell" : "/sbin/nologin" }
 
• skip(数字) //跳过前几行
– > db.集合名.find().skip(2)
rs1:PRIMARY> db.user.count()
43
rs1:PRIMARY> db.user.find().skip(41)
{ "_id" : ObjectId("5b617821e4ffddd428c72adb"), "name" : "apache", "password" : "x", "uid" : 48, "gid" : 48, "comment" : "Apache", "homedir" : "/usr/share/httpd", "shell" : "/sbin/nologin" }
{ "_id" : ObjectId("5b617821e4ffddd428c72adc"), "name" : "mysql", "password" : "x", "uid" : 27, "gid" : 27, "comment" : "MySQL Server", "homedir" : "/var/lib/mysql", "shell" : "/bin/false" }
 
• sort(字段名) //排序
– > db.集合名.find().sort({age:1|-1}) 1 升序 -1 降序
– >     db.user.find({shell:"/sbin/nologin"},{_id:0,name:1,uid:1,shell:1}).skip(2).limit(2)
rs1:PRIMARY> db.user.find({shell:"/sbin/nologin"},{_id:0,name:1,uid:1,shell:1}).skip(2).sort({uid:-1}).limit(5)
{ "name" : "libstoragemgmt", "uid" : 998, "shell" : "/sbin/nologin" }
{ "name" : "colord", "uid" : 997, "shell" : "/sbin/nologin" }
{ "name" : "saslauth", "uid" : 996, "shell" : "/sbin/nologin" }
{ "name" : "chrony", "uid" : 995, "shell" : "/sbin/nologin" }
{ "name" : "geoclue", "uid" : 994, "shell" : "/sbin/nologin" }
rs1:PRIMARY> db.user.find({shell:"/sbin/nologin"},{_id:0,name:1,uid:1,shell:1}).skip(2).sort({uid:1}).limit(5)
{ "name" : "adm", "uid" : 3, "shell" : "/sbin/nologin" }
{ "name" : "lp", "uid" : 4, "shell" : "/sbin/nologin" }
{ "name" : "mail", "uid" : 8, "shell" : "/sbin/nologin" }
{ "name" : "operator", "uid" : 11, "shell" : "/sbin/nologin" }
{ "name" : "games", "uid" : 12, "shell" : "/sbin/nologin" }
注意:这里的优先级是skip>sort>limit,即先执行skip,再执行sort,最后执行limit。
#####################################################################################
匹配条件
• 简单条件
– db.集合名.find({key:”值”})
– db.集合名.find({key:”值”,keyname:”值”})
– db.user.find({shell:"/bin/bash"})
– db.user.find({shell:"/bin/bash",shell:"/bin/bash"})-----匹配shell:"/bin/bash"且shell:"/bin/bash"条件都具备的
 
• 范围比较
– $in                                                     在…里
– $nin                                                     不在…里
– $or                                                     或
– > db.user.find({uid:{$nin:[1,6,9]}})
– > db.user.find({$or: [{name:"root"},{uid:1} ]})
rs1:PRIMARY> db.user.find({$or: [{name:"root"},{uid:1} ]})
{ "_id" : ObjectId("5b617821e4ffddd428c72ab2"), "name" : "yaya", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "", "homedir" : "/home/yaya", "shell" : "/bin/bash" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab3"), "name" : "root", "password" : "x", "uid" : 0, "gid" : 0, "comment" : "root", "homedir" : "/root", "shell" : "/bin/bash" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab4"), "name" : "bin", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "bin", "homedir" : "/bin", "shell" : "/sbin/nologin" }
 
• 正则匹配
– > db.user.find({name: /^a/ })---以a开头的
• 数值比较

$lt    <
$lte   <=
$gt    >
$gte   >=
$ne    !=
$eq    =
 
– db.user.find( { uid: { $gte:10,$lte:40} } , {_id:0,name
:1,uid:1})
– db.user.find({uid:{$lte:5,}})
 
rs1:PRIMARY> db.user.find({uid:{$eq:0}},{_id:0,name:1,uid:1})
{ "name" : "root", "uid" : 0 }
rs1:PRIMARY> db.user.find({uid:0},{_id:0,name:1,uid:1})----这样写更方便所以不用$eq
{ "name" : "root", "uid" : 0 }

rs1:PRIMARY> db.user.find({uid:{$gte:0,$lte:5}},{_id:0,name:1,uid:1})
{ "name" : "yaya", "uid" : 1 }
{ "name" : "root", "uid" : 0 }
{ "name" : "bin", "uid" : 1 }
{ "name" : "daemon", "uid" : 2 }
{ "name" : "adm", "uid" : 3 }
{ "name" : "lp", "uid" : 4 }
{ "name" : "sync", "uid" : 5 }
 
• 匹配null ,也可以匹配没有的字段
– > db.user.save({name:null,uid:null})
– > db.user.find({name:null})
{ "_id" : ObjectId("5afd0ddbd42772e7e458fc7
5"), "name" : null, "uid" : null }
##################################################################################

2-3、更新文档(改)

update()
• 语法格式
– > db.集合名.update({条件},{修改的字段})
注意:默认只修改与条件匹配的第1行,并且把该行文档改造为了只剩下修改的字段的新文档
实例:
rs1:PRIMARY> db.a3.save({id:1,name:"harry"})
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.a3.save({id:1,name:"jack"})
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.a3.save({id:1,name:"tom"})
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.a3.find()
{ "_id" : ObjectId("5b62c1050c4f4bedcf36b47d"), "id" : 1, "name" : "harry" }
{ "_id" : ObjectId("5b62c10e0c4f4bedcf36b47e"), "id" : 1, "name" : "jack" }
{ "_id" : ObjectId("5b62c1170c4f4bedcf36b47f"), "id" : 1, "name" : "tom" }
rs1:PRIMARY> db.a3.update({id:1},{name:"peter"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.a3.find()
{ "_id" : ObjectId("5b62c1050c4f4bedcf36b47d"), "name" : "peter" }
{ "_id" : ObjectId("5b62c10e0c4f4bedcf36b47e"), "id" : 1, "name" : "jack" }
{ "_id" : ObjectId("5b62c1170c4f4bedcf36b47f"), "id" : 1, "name" : "tom" }
rs1:PRIMARY> db.a3.update({id:1},{sex:"girl"})----也可以修改为之前没有的字段名
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.a3.find()
{ "_id" : ObjectId("5b62c1050c4f4bedcf36b47d"), "name" : "peter" }
{ "_id" : ObjectId("5b62c10e0c4f4bedcf36b47e"), "sex" : "girl" }
{ "_id" : ObjectId("5b62c1170c4f4bedcf36b47f"), "id" : 1, "name" : "tom" }
 

多文档更新
• 语法格式:默认只更新与条件匹配的第1行
– > db.user.update({条件},{$set:{修改的字段}} ,false,true)---$set保留原有其它字段,false,true是对所有匹配的文档操作,而不再只是对第一个匹配的文档操作
– > db.user.update({name:“bin”},{$set:{password:“abc12123”}},false,true)
 
$set / $unset
• $set 条件匹配时,修改指定字段的值  ,保留原有其它字段 
– db.user.update({条件},$set: {修改的字段})
– db.user3.update({name:"bin"},{$set:{password:"A"}}
• $unset 删除与条件匹配的文档的字段
– db.集合名.update({条件},{$unset:{key:values}})
– db.user3.update({name:"bin"},{$unset:{password:"A"}})
 
$inc
• $inc 条件匹配时,字段值自加或自减
– Db.集合名.update({条件},{$inc:{字段名:数字}})
注意:正整数自加 负整数自减
– db.user.update({name:"bin"},{$inc:{uid:2}}) 字段值自加2
– db.user.update({name:“bin”},{$inc:{uid:-1}}) 字段自减1
 
$push/$addToSet
• $push 向数组中添加新元素
– db.集合名.update({条件},{$push:{数组名:“值”}})
– db.user.insert({name:"bob",likes:
["a","b","c","d","e","f"]})
– db.user.update({name:“bob”},{$push:{likes:“w"}})
• $addToSet 避免重复添加
– db.集合名.update({条件},{$addToSet:{数组名:”
值”}}) db.user.update({name:"bob"},{$addToSet:{likes:“f"}})
$pop/$pull
• $pop从数组头部删除一个元素
– db.集合名.update({条件},{$pop:{数组名:数字}})
– db.user.update({name:"bob"},{$pop:{likes:1}})----删除尾部一个元素
– db.user.update({name:"bob"},{$pop:{likes:-1}})-----删除头部一个元素
1 删除数组尾部元素 -1 删除数组头部元素
rs1:PRIMARY> db.user.find({name:"bob"})
{ "_id" : ObjectId("5b62ccd80c4f4bedcf36b482"), "name" : "bob", "likes" : [ "a", "b", "c", "d", "e", "w" ] }
rs1:PRIMARY> db.user.update({name:"bob"},{$pop:{likes:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.user.find({name:"bob"})
{ "_id" : ObjectId("5b62ccd80c4f4bedcf36b482"), "name" : "bob", "likes" : [ "a", "b", "c", "d", "e" ] }
rs1:PRIMARY> db.user.update({name:"bob"},{$pop:{likes:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.user.find({name:"bob"})
{ "_id" : ObjectId("5b62ccd80c4f4bedcf36b482"), "name" : "bob", "likes" : [ "b", "c", "d", "e" ] }
 
• $pull 删除数组指定元素
– db.集合名.update({条件},{$pull:{数组名:值}})
– db.user.update({name:"bob"},{$pull:{likes:"b"}})
rs1:PRIMARY> db.user.update({name:"bob"},{$pull:{likes:"d"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs1:PRIMARY> db.user.find({name:"bob"})
{ "_id" : ObjectId("5b62ccd80c4f4bedcf36b482"), "name" : "bob", "likes" : [ "b", "c", "e" ] }
 

2-4、删除文档

drop()  Remove()
• $drop 删除集合的同时删除索引
– db.集合名.drop( )
– db.user.drop( )
• remove()删除文档时不删除索引
– db.集合名.remove({}) -------------删除所有文档
– db.集合名.remove({条件}) -----------删除与条件匹配的文档
– db.user.remove({uid:{$lte:10}})
– db.user.remove({})
 
文档更新命令总结
$set    -------------------             修改文档指定字段的值
$unset    ----------------         删除记录中的字段
$push    ------------             向数组内添加新元素
$pull     ------------------            删除数组中的指定元素
$pop       -------------          删除数组头尾部元素
$addToSet   -------------          避免数组重复赋值
$inc     ------------            字段自加或自减
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/Perfect11_1/article/details/81366399
今日推荐