MongoDB、副本集

一、MongoDB

介绍

  1. 介于关系数据库和非关系数据库之间的产品
  2. 一款基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案
  3. 将数据存储为一个文档(类似JSON对象),数据结构由键值(key => value)组成
  4. 支持丰富的查询表达,可以设置任何属性的索引
  5. 支持副本集,分片

一、部署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复制原理

  1. 副本集工作过程:至少需要2个节点。其中一个是主节点负责处理客户端请求,其余是从节点,负责复制主节点数据
  2. 常见搭配方式:一主一从、一主多从
  3. 主节点记录所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致

副本集实现方式

Master-slave主从复制

  1. 启动一台服务器时加上"-master"参数,作为主节点
  2. 启动其他服务器时加上"-slave"和"-source"参数,作为从节点

主从复制的优点

  1. 从节点可以提供数据查询,降低主节点的访问压力
  2. 由从节点执行备份,避免锁定主节点数据
  3. 当主节点故障时,可快速切换到从节点,实现高可用

Replica Sets副本集

  1. 从1.6版本开始支持,优于之前的replication
  2. 支持故障自动切换、自动修复成员节点,降低运维成本
  3. Replica Sets副本集的结构类似高可用集群

[192.168.4.52-53]参考如下操作(部署mongodb服务)

在[192.168.4.51]部署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([
... {_id:9,name:"kenji"},
... {_id:10,name:"merry"},
... {_id:11,name:"chihiro"},
... {_id:12,name:"harry"}

... ])

rs1:PRIMARY> db.t2.find()
{ "_id" : 9, "name" : "kenji" }
{ "_id" : 10, "name" : "merry" }
{ "_id" : 11, "name" : "chihiro" }
{ "_id" : 12, "name" : "harry" }

  • 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

发布了67 篇原创文章 · 获赞 13 · 访问量 4074

猜你喜欢

转载自blog.csdn.net/tongzhuo1220/article/details/90513047