一、MongoDB
介绍
- 介于关系数据库和非关系数据库之间的产品
- 一款基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案
- 将数据存储为一个文档(类似JSON对象),数据结构由键值(key => value)组成
- 支持丰富的查询表达,可以设置任何属性的索引
- 支持副本集,分片
一、部署MongoDB服务 [192.168.4.50]
- 1.安装并创建工作目录(无需安装,解包即用)
[root@host50 ~]# cd soft/mongodb/
[root@host50 mongodb]# ls
linkmongodb.php mongo-1.6.16.tgz mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@host50 mongodb]# mkdir /usr/local/mongodb
[root@host50 mongodb]# tar -xf mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@host50 mongodb]# cd mongodb-linux-x86_64-rhel70-3.6.3/
[root@host50 mongodb-linux-x86_64-rhel70-3.6.3]# ls
bin GNU-AGPL-3.0 MPL-2 README THIRD-PARTY-NOTICES
[root@host50 mongodb-linux-x86_64-rhel70-3.6.3]# cp -r bin /usr/local/mongodb/
[root@host50 mongodb-linux-x86_64-rhel70-3.6.3]# cd /usr/local/mongodb/
[root@host50 mongodb]# mkdir -p etc log data/db
[root@host50 mongodb]# ls
bin data etc log
- 2.修改配置文件
cd /usr/local/mongodb
[root@host50 mongodb]# vim etc/mongdb.conf
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
dbpath=/usr/local/mongodb/data/db
fork=true
- 启服务
[root@host50 mongodb]# /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongdb.conf
[root@host50 mongodb]# ss -nutlp | grep 27017
tcp LISTEN 0 128 127.0.0.1:27017 *:* users:(("mongod",pid=3356,fd=11))
[root@host50 mongodb]# /usr/local/mongodb/bin/mongo
> show dbs
admin 0.000GB
local 0.000GB
> use local
switched to db local
> db
local
> show tables
startup_log
> exit
- 查看文件
[root@host50 mongodb]# cat log/mongodb.log 日志
[root@host50 mongodb]# ls data/db/
collection-0--4440935192905888497.wt index-1--4440935192905888497.wt journal storage.bson WiredTiger.turtle
collection-2--4440935192905888497.wt index-3--4440935192905888497.wt _mdb_catalog.wt WiredTiger WiredTiger.wt
collection-4--4440935192905888497.wt index-5--4440935192905888497.wt mongod.lock WiredTigerLAS.wt
diagnostic.data index-6--4440935192905888497.wt sizeStorer.wt WiredTiger.lock
- 停服务
[root@host50 mongodb]# /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongdb.conf --shutdown
killing process with pid: 3356
- 设置别名
[root@host50 ~]# vim /root/.bashrc
alias mstop='/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongdb.conf --shutdown'
alias mstart='/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongdb.conf'
- 修改服务使用的ip地址和服务端口
默认 lo:27017
[root@host50 ~]# mstop
[root@host50 ~]# vim /usr/local/mongodb/etc/mongdb.conf
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
dbpath=/usr/local/mongodb/data/db
fork=true
bind_ip=192.168.4.50
port=27050
[root@host50 ~]# mstart
[root@host50 ~]# netstat -nutlp | grep mongod
tcp 0 0 192.168.4.50:27050 0.0.0.0:* LISTEN 5246/mongod
[root@host50 ~]# /usr/local/mongodb/bin/mongo -host 192.168.4.50 --port 27050
-
在[192.168.4.51]部署mongodb服务
解包 tar -xf mongodb-linux-x86_64-rhel70-3.6.3.tgz
cd mongodb-linux-x86_64-rhel70-3.6.3/
建工作目录 mkdir /usr/local/mongodb
拷贝 cp -r bin/ /usr/local/mongodb
cd /usr/local/mongodb
mkdir -p log etc data/db
修改配置文件 vim vim 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.50
port=27050
启服务
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf
设置别名
[root@host51 mongodb]# /usr/local/mongodb/bin/mongo --host 192.168.4.51 --port 27051
查看库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
登50的数据库
[root@host51 mongodb]# /usr/local/mongodb/bin/mongo --host 192.168.4.50 --port 27050
- 常用管理命令
show dbs #查看已有的库
db #显示当前所在的库
use 库名 #切换库,若库不存在延时创建
show tables或show collections #查看库下已有的集合
db.dropDatabase() #删除当前所在的库(区分大小写可Tab)
show collections 或 show tables #查看集合
db.集合名.drop() #删除集合
db.集合名.save({","}) #创建集合,集合不存在时,创建并添加文档
> db.t1.save({school:"beijing",address:"taren",tel:119})
db.集合名.find()
db.集合名.count()
db.集合名.insert({"name":"jim"})
db.集合名.find({条件})
db.集合名.findOne() #返回第一条文档
db.集合名.remove({}) #删除所有文档
db.集合名.remove({条件}) #删除匹配的所有文档
- 名称规范
数据库名称不能是空字符串(""),不能含有''(空格),.,$,/,\和\0(空字符),应全部小写
集合名称不能是空字符串,
- 基本数据类型
1.字符串string
> db.t3.save({name:"lucy",class:"nsd1902"})
> db.t3.save({姓名:"张三峰",地址:"深圳"})
WriteResult({ "nInserted" : 1 })
2.布尔bool (true真 | 假false)
> db.t3.save({name:"tom",momey:false,card:true})
3.空null
> db.t3.save({name:"lucy",ruslt:null})
> db.t3.find()
{ "_id" : ObjectId("5ce7ac582770c08f6acddad1"), "name" : "lucy", "class" : "nsd1902" }
{ "_id" : ObjectId("5ce7ac8e2770c08f6acddad2"), "姓名" : "张三峰", "地址" : "深圳" }
{ "_id" : ObjectId("5ce7acd92770c08f6acddad3"), "name" : "tom", "momey" : false, "card" : true }
{ "_id" : ObjectId("5ce7ad092770c08f6acddad4"), "name" : "lucy", "ruslt" : null }
4.数值
shell默认使用64位浮点型数值。
NumberInt(4字节整数) 可以写小,但不会存小数
NumberLong(8字节整数)不能写小数
> db.t3.save({x:3003,y:3.23})
> db.t3.save({x:NumberInt(99.99)})
> db.t3.save({x:NumberLong(88.77)}) #会报错
5.数组array
db.t2.save({x:["a","b","c"]})
> db.t2.save({name:"bob",like:["hpop","look","eat"]})
6.代码
db.t2.save({x:function(){/*代码*/}})
> db.t3.save({lname:"php",phpcode:function(){/*<?php echo "hello boy!!;?>*/}})
7.日期
db.t2.save({x:new Date()})
> db.t3.save({name:"jack",birthday:"2019/05/25"})
> db.t3.save({name:"jack2",birthday:new Date()})
> db.t3.find()
{ "_id" : ObjectId("5ce7ac582770c08f6acddad1"), "name" : "lucy", "class" : "nsd1902" }
{ "_id" : ObjectId("5ce7ac8e2770c08f6acddad2"), "姓名" : "张三峰", "地址" : "深圳" }
{ "_id" : ObjectId("5ce7acd92770c08f6acddad3"), "name" : "tom", "momey" : false, "card" : true }
{ "_id" : ObjectId("5ce7ad092770c08f6acddad4"), "name" : "lucy", "ruslt" : null }
{ "_id" : ObjectId("5ce7ad5d2770c08f6acddad5"), "x" : 3003, "y" : 3.23 }
{ "_id" : ObjectId("5ce7ad7e2770c08f6acddad6"), "x" : 99 }
{ "_id" : ObjectId("5ce7ae032770c08f6acddad7"), "name" : "bob", "likes" : [ "hpop", "look", "eat" ] }
{ "_id" : ObjectId("5ce7ae5d2770c08f6acddad8"), "lname" : "php", "phpcode" : { "code" : "function (){/*<?php echo \"hello boy!!;?>*/}" } }
{ "_id" : ObjectId("5ce7ae832770c08f6acddad9"), "name" : "jack", "birthday" : "2019/05/25" }
{ "_id" : ObjectId("5ce7aea42770c08f6acddada"), "name" : "jack2", "birthday" : ISODate("2019-05-24T08:43:16.556Z") }
8.对象
对象id是一个12字节的字符串,是文档的唯一标识 {x:ObjectId()}
> db.t3.save(
... {num:ObjectId(),name:"jack3",
... age:19
... })
> db.t3.find({name:"jack3"})
{ "_id" : ObjectId("5ce7b18c2770c08f6acddadc"), "num" : ObjectId("5ce7b18c2770c08f6acddadb"), "name" : "jack3", "age" : 19 }
9.内嵌=(redis的hash类型)
> db.t4.save({tarena:{worker:"hsy",tel:119,address:"shenzhen",people:1000},money:1000})
10.正则表达式(通常做查询条件)
> db.t4.save({linenull:/^$/,linefirst:/^/})
> db.t4.find()
{ "_id" : ObjectId("5ce7b41f2770c08f6acddadd"), "tarena" : { "worker" : "hsy", "tel" : 119, "address" : "shenzhen", "people" : 1000 }, "money" : 1000 }
{ "_id" : ObjectId("5ce7b4502770c08f6acddade"), "linenull" : /^$/, "linefirst" : /^/ }
- 数据导入与导出
导出
1.csv格式(要-f指定字段名)
格式1:]# mongoexport [--host ip地址 --port 端口 ] -d 库名 -c 集合名 -f 字段名1,字段名2 --type=csv > 目录名/文件名.csv
格式2:]# mongoexport --host ip地址 --port 端口 -库名 -c 集合名 -q '{条件}' -f 字段名1,字段名2 --type=csv > 目录名/文件名.csv
[root@host50 ~]# /usr/local/mongodb/bin/mongoexport --host 192.168.4.50 --port 27050 -d userdb -c t3 -f name,age --type=csv > t3.tst
[root@host50 ~]# /usr/local/mongodb/bin/mongoexport --host 192.168.4.50 --port 27050 -d userdb -c t3 -q '{name:/.*jack.*/}' -f name,age --type=csv > t2-1.txt
2.json格式(不指定csv则默认json)
格式:]# mongoexport --host ip地址 --port 端口 -d 库名 -c 集合名 --type=json > t2-2.txt
[root@host50 ~]# /usr/local/mongodb/bin/mongoexport --host 192.168.4.50 --port 27050 -d userdb -c t3 --type=json > t2-2.txt
[root@host50 ~]# cat t2-2.txt
导入
mysql 建表 把文件拷贝文件要指定的路径再执行导入命令
把系统文件修改为服务识别的格式json/csv
格式1:mongoimport --host ip地址 --port 端口 -d 库名 -c 集合名 --type=json 目录名/文件名.json
格式2:mongoimport --host ip地址 --port 端口 -d 库名 -c 集合名 --type=csv [--headerline忽略标题] [--drop删除原数据后导入新数据] 目录名/文件名.csv
导入数据时,若库和集合不存在,则先创建库和集合后再导入数据;若库和集合已存在则以追加的方式导入数据导集合里;
[root@host50 ~]# /usr/local/mongodb/bin/mongoimport --host 192.168.4.50 --port 27050 -d userdb -c v1 --headerline --drop --type=csv /root/t3.tst
[root@host50 ~]# /usr/local/mongodb/bin/mongoimport --host 192.168.4.50 --port 27050 -d userdb -c a1 --type=json /root/t2-2.txt
把/etc/passwd 导入mongodb
[root@host50 ~]# cp /etc/passwd /root
[root@host50 ~]# sed -i 's/:/,/g' passwd #文件修改为csv格式
- 1. [root@host50 ~]# vim passwd
第1行 user,pass,uid,gid,commit,homedir,shell
- 2.sed -i '1iuser,pass,uid,gid,commit,homedir,shell' /root/passwd
[root@host50 ~]# /usr/local/mongodb/bin/mongoimport --host 192.168.4.50 --port 27050 -d userdb -c a2 --headerline --drop --type=csv /root/passwd
[root@host50 ~]# /usr/local/mongodb/bin/mongo --host 192.168.4.50 --port 27050
> db.a2.find()
- 数据备份与恢复
备份
[root@host50 ~]# /usr/local/mongodb/bin/mongodump --host 192.168.4.50 --port 27050
[root@host50 ~]# ls dump/userdb/
[root@host50 userdb]# mkdir /mbak
[root@host50 userdb]# /usr/local/mongodb/bin/mongodump --host 192.168.4.50 --port 27050 -d userdb -c a2 -o /mbak
[root@host50 userdb]# ls /mbak/userdb/
a2.bson a2.metadata.json
[root@host50 userdb]# /usr/local/mongodb/bin/bsondump /mbak/userdb/a2.bson #查看文件(不支持cat查看)
恢复
[root@host50 userdb]# scp -r /mbak/ 192.168.4.51:/root
[root@host51 ~]# ls mbak/
[root@host51 ~]# /usr/local/mongodb/bin/mongorestore --host 192.168.4.51 --port 27051 -d userdb -c user(不存在则自动创建) /root/mbak/userdb/a2.bson[root@host51 ~]# /usr/local/mongodb/bin/mongo --host 192.168.4.51 --port 27051
> show dbs
> use userdb
> db.user.find()
数据类型=赋值方式
二、MongoDB副本集(高可用集群)
1.环境准备
[192.168.4.50]
[192.168.4.51] 主
[192.168.4.52] 51的副本
[192.168.4.53] 51的副本
介绍
也叫Mongodb复制
至少需要3台
指在多台服务器上存储数据副本并实现数据同步
提高数据可用性、安全性、方便数据故障恢复
主角色宕机,副本会有一个升为主
mongodb复制原理
- 副本集工作过程:至少需要2个节点。其中一个是主节点负责处理客户端请求,其余是从节点,负责复制主节点数据
- 常见搭配方式:一主一从、一主多从
- 主节点记录所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致
副本集实现方式
Master-slave主从复制
- 启动一台服务器时加上"-master"参数,作为主节点
- 启动其他服务器时加上"-slave"和"-source"参数,作为从节点
主从复制的优点
- 从节点可以提供数据查询,降低主节点的访问压力
- 由从节点执行备份,避免锁定主节点数据
- 当主节点故障时,可快速切换到从节点,实现高可用
Replica Sets副本集
- 从1.6版本开始支持,优于之前的replication
- 支持故障自动切换、自动修复成员节点,降低运维成本
- Replica Sets副本集的结构类似高可用集群
[192.168.4.52-53]参考如下操作(部署mongodb服务)
2.配置副本集
[192.168.4.51-53]下面以51为例
[root@host51 ~]# mstop
[root@host51 ~]# 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 #副本集配置[root@host51 ~]# mstart
3.定义成员列表
redis需清空数据库目录,副本集不需要
在哪一台创建副本集则默认他为主
[root@host51 ~]# /usr/local/mongodb/bin/mongo --host 192.168.4.51 --port 27051
> config = { _id:"rs1", members:[{_id:0,host:"192.168.4.51:27051,priority:10"}, #priority优先级,指定哪台为主服务器,不写则默认操作的本机
{_id:1,host:"192.168.4.52:27052"},
{_id:2,host:"192.168.4.53:27053"} ] }
{
"_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"
}
]
}
> rs.initiate(config) #初始化replica sets环境
{
"ok" : 1,
"operationTime" : Timestamp(1558756173, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1558756173, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
rs1:SECONDARY> 回车
rs1:PRIMARY>
注:副本主机不允许对数据做操作,主库才可以
副本集创建失败解决:
1.断开连接,重复以上定义成员操作
2.(还原)停止服务;删除配置文件里的副本集配置replSet=rs1去掉;
启动服务,连接服务后删除local 库,断开连接;
配置文件启用副本集配置;重启服务;连接服务后,
创建成员列表,然后创建副本集
- 查看副本集信息(任意一台副本集主机查看)
rs1:SECONDARY> rs.status() #查看状态信息
.....
"members" : [
{
"_id" : 0,
"name" : "192.168.4.51:27051",
"health" : 1,
.....
"_id" : 2,
"name" : "192.168.4.53:27053",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 8404,
"syncingTo" : "192.168.4.51:27051", #id2同步该主机的数据
"configVersion" : 1
}
rs1:SECONDARY> rs.isMaster() #查看是否为master库
{
"hosts" : [
"192.168.4.51:27051",
"192.168.4.52:27052",
"192.168.4.53:27053"
],
"setName" : "rs1",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.4.51:27051",
"me" : "192.168.4.53:27053",
......
客户端50 访问副本集
1.存取数据(数据同步测试)
[root@host50 userdb]# /usr/local/mongodb/bin/mongo --host 192.168.4.51 --port 27051
rs1:PRIMARY> use userdb
rs1:PRIMARY> db.a4.save({name:"bob",age:19})
rs1:PRIMARY> db.a4.find()
存数据,然后去从节点查看是否同步
[root@host50 userdb]# /usr/local/mongodb/bin/mongo --host 192.168.4.52 --port 27052
rs1:SECONDARY> db.getMongo().setSlaveOk() #同步数据验证,允许从库查看数据
rs1:SECONDARY> show dbs
rs1:SECONDARY> use userdb
rs1:SECONDARY> show tables
rs1:SECONDARY> db.a4.find()
测试高可用
- 1.停止主服务器51的服务
[root@host51 ~]# mstop
- 2.会自动在2个副本服务器里选举新的主服务器(有自己的算法)
[root@host52 ~]# /usr/local/mongodb/bin/mongo --host 192.168.4.52 --port 27052
rs1:PRIMARY> rs.status()
"members" : [
{
"_id" : 0,
"name" : "192.168.4.51:27051",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
....
"_id" : 1,
"name" : "192.168.4.52:27052",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 11848,
....
"_id" : 2,
"name" : "192.168.4.53:27053",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 10399,
"optime" : {
"ts" : Timestamp(1558766570, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1558766570, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-05-25T06:42:50Z"),
"optimeDurableDate" : ISODate("2019-05-25T06:42:50Z"),
"lastHeartbeat" : ISODate("2019-05-25T06:42:52.480Z"),
"lastHeartbeatRecv" : ISODate("2019-05-25T06:42:53.598Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.4.52:27052",
"configVersion" : 1
- 3.连接新的主服务器存取数据
rs1:PRIMARY> use userdb
rs1:PRIMARY> show tables
rs1:PRIMARY> db.t1.save({name:"tom",addre:"shenzhen"})
rs1:PRIMARY> db.t1.save({name:"lucy",addre:"shenzhen"})
测试自动恢复
启动51的mongodb服务
[root@host51 ~]# mstart
访问51查看数据
[root@host51 ~]# /usr/local/mongodb/bin/mongo --host 192.168.4.51 --port 27051
rs1:SECONDARY> db.getMongo().setSlaveOk()
rs1:SECONDARY> show dbs
rs1:SECONDARY> use userdb
rs1:SECONDARY> show tables
rs1:SECONDARY> db.t1.find() #查看宕机期间的数据是否也同步
rs1:SECONDARY> rs.status() #查看此时的主从状态
"members" : [
{
"_id" : 0,
"name" : "192.168.4.51:27051",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 445,
...
"syncingTo" : "192.168.4.53:27053",
"configVersion" : 1,
"self" : true
"_id" : 1,
"name" : "192.168.4.52:27052",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 443,
...
"_id" : 2,
"name" : "192.168.4.53:27053",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 443,
...
"syncingTo" : "192.168.4.52:27052",
"configVersion" : 1
....
三、MongoDB文档管理
- 1.插入文档
插入多个字段值
db.集合名.save({key:"值",key:"值"})
集合不存在时自动创建集合,然后再插入记录
_id字段值已存在时,修改文档的字段值
_id字段值不存在时,插入文档
db.集合名.insert({key:"值",key:"值"})
集合不存在时自动创建集合,然后再插入记录
_id字段值已存在时,放弃插入
_id字段值不存在时,插入文档
rs1:PRIMARY> db.v1.save({_id:7,name:"bob"})
rs1:PRIMARY> db.v1.save({_id:7,name:"Tom"})
rs1:PRIMARY> db.v1.save({_id:8,name:"Tom"})
rs1:PRIMARY> db.v1.find()
{ "_id" : 7, "name" : "Tom" }
{ "_id" : 8, "name" : "Tom" }
rs1:PRIMARY> db.v1.save({_id:8,name:"Tom",age:19})
rs1:PRIMARY> db.v1.insert({_id:7,name:"bob"}) #会报错,已存在
rs1:PRIMARY> db.v1.insert({_id:6,name:"bob"})
插入多条记录
db.集合名.insertMany([{key:"值"},{key:"值",key:"值"}])
例:db.t2.insertMany( [ {name:"plj",age:22}, {name:"baba",email:"qq.@com"} ] } rs1:PRIMARY> db.t2.insertMany([ ... ]) rs1:PRIMARY> db.t2.find() |
- 2.查询文档
db.集合名.find() #默认输出20行,输入it可显示后续行
db.集合名.find(key:"值",key:"值") #查找符合多个条件的
db.集合名.findOne() #显示第1行
db.集合名.find({条件},{定义显示的字段})
db.集合名.find({},{_id:0,字段名:1,shell:1}) 0不显示,1显示
db.集合名. limit(数字) #显示前几行
db.集合名.find(条件).skip(数字) #跳过前几行
db.集合名.find(条件).sort(字段名:1|-1) #1升序,-1降序
db.user.find({shell:"/bin/bash"},{_id:0,name:1,uid:1,shell:1}).skip(2).limit(2)
db.集合名.count() #统计行数
rs1:PRIMARY> db.a2.find()
rs1:PRIMARY> db.a2.find({},{_id:0})
rs1:PRIMARY> db.a2.find({},{_id:0, user:1 , uid:1}) #0不显示,1显示
rs1:PRIMARY> db.a2.count()rs1:PRIMARY> db.a2.find({shell:"/bin/bash"},{_id:0,user:1,shell:1}).count()
rs1:PRIMARY> db.a2.findOne()
rs1:PRIMARY> db.a2.findOne({shell:"/bin/bash"},{_id:0,user:1,uid:1})
rs1:PRIMARY> db.a2.find({shell:"/sbin/nologin"},{_id:0,user:1,uid:1,shell:1}).limit(4)
rs1:PRIMARY> db.a2.find({shell:"/sbin/nologin"},{_id:0,user:1,uid:1,shell:1}).skip(2)
rs1:PRIMARY> db.a2.find({shell:"/sbin/nologin"},{_id:0,user:1,uid:1,shell:1}).sort({uid:1})
rs1:PRIMARY> db.a2.find({shell:"/sbin/nologin"},{_id:0,user:1,uid:1,shell:1}).sort({uid:-1})
- 3.匹配条件(适用于)
db.集合名.find({字段名:{$in:[1,6,9]}}) #在...里
db.集合名.find({字段名:{$nin:[1,6,9]}}) #不在...里
db.集合名.find({$or:[{字段名:"值"},{字段名:"值"} ] } ) #或
db.集合名.find({ $or:[{},{},{}]},{})
正则匹配
db.集合名.find({字段名:/^a$/}) ”/正则符号/“
数值比较
$lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于
db.user.find({uid:{$gte:10,$lte:40}},{_id:0,name:1,uid:1})
db.集合名.find({字段名:null}) #匹配为空的字段,加双引号意义就不同里
rs1:PRIMARY> db.a2.find({uid:3},{_id:0})
rs1:PRIMARY> db.a2.find({user:"root"},{_id:0})
rs1:PRIMARY> db.a2.find({user:"root",uid:7},{_id:0}) #匹配不到结果
rs1:PRIMARY> db.a2.find({user:"root",uid:0},{_id:0})
rs1:PRIMARY> db.a2.find({user:{$in:["root","bin","adm"]}},{_id:0,user:1})
rs1:PRIMARY> db.a2.find({uid:{$nin:[7,5,0]}},{_id:0,user:1,uid:1})
rs1:PRIMARY> db.a2.find({$or:[{user:"root"},{uid:1},{shell:"/bin/bash"}]},{_id:0,user:1,uid:1})
rs1:PRIMARY> db.a2.find({user:/t$/},{_id:0,user:1})
rs1:PRIMARY> db.a2.find({uid:1},{_id:0,user:1,uid:1})
rs1:PRIMARY> db.a2.find({uid:{$lt:10}},{_id:0,user:1,uid:1})
rs1:PRIMARY> db.a2.find({uid:{$gte:10,$lte:20}},{_id:0,user:1,uid:1}) #uid大于等于10且小于等于20,_id不显示 user,uid显示
- 4.更新文档
db.集合名.update({条件},{修改的字段}) 把文件其他字段都删除里,只留下了修改的字段且只修改与匹配的第1行
db.集合名.update({条件},{$set:{修改的字段}},false,true) #默认只更新与条件匹配的第1行,只修改你指定的修改字段,行的其他不变
$set 条件匹配时,只修改指定字段的值
$unset 删除与条件匹配文档的字段
$inc 条件匹配时,字段值自加或自减
$push 向数组中添加新的元素
$addToSet 避免重复添加
$pop:{数组名:数字} #从数组头部删除一个元素 数字1删除数组尾部元素 -1删除数组头部元素
$pull:{字段名:"元素"} 删除数组指定元素
db.集合名.drop() #删除集合的同时删除索引
db.集合名.remove() #删除所有文档
db.集合名.remove({}) #删除与条件匹配的文档
rs1:PRIMARY> db.a2.find({uid:{$gte:3,$lte:10}},{_id:0})
rs1:PRIMARY> db.a2.update({uid:{$gte:3,$lte:10}},{$set:{pass:"AA",commit:"student"}},false,true) #符合条件的所有行只修改你定义的字段,其他的全不变
rs1:PRIMARY> db.a2.find({uid:{$gte:3,$lte:10}},{_id:0})
rs1:PRIMARY> db.a2.update({user:"roota"},{$unset:{pass:"AA"}})
rs1:PRIMARY> db.a2.find({user:"bin"},{_id:0,user:1,uid:1})
rs1:PRIMARY> db.a2.update({user:"bin"},{$inc:{uid:+2}}) #uid++2
rs1:PRIMARY> db.t2.save({user:"jack",likes:["a","c","b","d"]})
rs1:PRIMARY> db.t2.find({user:"jack"},{_id:0})
rs1:PRIMARY> db.t2.update({user:"jack"},{$push:{likes:"e"}})rs1:PRIMARY> db.t2.update({user:"jack"},{$push:{likes:"e"}}) #可以添加重复值
rs1:PRIMARY> db.t2.update({user:"jack"},{$addToSet:{likes:"a"}}) #修改失败
rs1:PRIMARY> db.t2.update({user:"jack"},{$addToSet:{likes:"f"}}) #插入成功
rs1:PRIMARY> db.t2.update({user:"jack"},{$pop:{likes:-1}}) #删除第一个值rs1:PRIMARY> db.t2.update({user:"jack"},{$pop:{likes:1}}) #删除末尾值
rs1:PRIMARY> db.t2.update({user:"jack"},{$pull:{likes:"c"}}) #是c 的值都删除
rs1:PRIMARY> db.t2.remove({}) #删除所有文档,索引不删rs1:PRIMARY> db.t2.count()
rs1:PRIMARY> show tables
rs1:PRIMARY> db.a2.count()
44
rs1:PRIMARY> db.a2.remove({uid:{$gte:100}})
WriteResult({ "nRemoved" : 17 })
rs1:PRIMARY> db.a2.count()
27
rs1:PRIMARY> db.t2.drop() #删除文档同时删除索引
true
rs1:PRIMARY> show tables
更新命令总结:
$set 修改文档指定字段的值
$unset 删除记录中的字段
$push 向数组添加新元素
$pull 删除数组中指定元素
$pop 删除数组头尾部元素
$addToSet 避免数组重复赋值
$inc 字段自加或自减
数据库:
RDBMS=====mysql :关系型数据库,预先定义结构
nosql======redis,mongodb