MongoDB是一个文档数据库引擎,文档数据库和MySQL这种关系型数据库是不一样的设计,文档数据库和Redis这种Key-Value数据库也有很大差别。不过文档数据库和Key-Value数据库都属于NoSQL型的数据库,也便是说MongoDB也是不支持SQL语句的。
MongoDB相对付MySQL数据库来说有一项独占的非常强大的特点,便是MongoDB的数据表构造是自由的,可以针对每一个文档(一行数据)定义不同的字段。
MongoDB的文档的存储格式是主流的数据个数JSON,JSON数据是可以设计成一个树状构造的,可以将一个工具的属性以及子属性、孙属性乃至更详细的属性保存到一个JSON数据当中,而MongoDB的一个文档就可以保存它,而无需事先设计好数据表构造来适应这种工具。

安装环境
CentOS:CentOS Linux release 7.6.1810 (Core)Linux:Linux version 3.10.0-1062.el7.x86_64GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
软件版本
mongodb-linux-x86_64-rhel70-4.2.2.tgz
准备事情本地化
如果是新环境,我们须要设置时区以担保韶光显示精确
timedatectlset-timezoneAsia/Shanghai
安装wget
如果环境里没有wget,通过yum安装一下
yum-yinstallwget
安装依赖包
yum-yinstalllibaionumactl-libs
建立环境根目录
mkdir-p/tongfu.net/env/
建立安装包目录并进入
mkdir/packagescd/packages
安装MongoDB 4.2
官网下载
从官网下载
wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.2.tgz
网盘下载
如果官网下载太慢,可以从网盘下载
链接: https://pan.baidu.com/s/1KjL759qM81Ix_ZRZZxdepg 提取码: yvpi
安装
设置mongo环境变量
[root@tfdevenv]#vi/etc/profileexportMONGODB_HOME=/tongfu.net/env/mongodb-4.2.2exportPATH=$MONGODB_HOME/bin:$PATH
立即启用环境变量
source/etc/profile
创建用户
useraddmongo
解压缩
tar-xzvfmongodb-linux-x86_64-rhel70-4.2.2.tgz-C/tongfu.net/env/cd/tongfu.net/env/mvmongodb-linux-x86_64-rhel70-4.2.2/mongodb-4.2.2
建立数据目录
mkdir/tongfu.net/env/mongodb-4.2.2/confmkdir/tongfu.net/env/mongodb-4.2.2/datamkdir/tongfu.net/env/mongodb-4.2.2/logs
建立配置文件
[root@tfdevenv]#vi/tongfu.net/env/mongodb-4.2.2/conf/mongodb.confdbpath=/tongfu.net/env/mongodb-4.2.2/data/logpath=/tongfu.net/env/mongodb-4.2.2/logs/mongodb.logbind_ip=0.0.0.0wiredTigerCacheSizeGB=2auth=truejournal=true
设置权限
chownmongo.mongo-R/tongfu.net/env/mongodb-4.2.2/
自动启动
添加自动启动脚本
[root@tfdevenv]#cat>/lib/systemd/system/mongod.service<<EOF[Unit]Description=mongodAfter=network.target[Service]Type=forkingUser=mongoGroup=mongoExecStart=/tongfu.net/env/mongodb-4.2.2/bin/mongod-f/tongfu.net/env/mongodb-4.2.2/conf/mongodb.conf--forkExecStop=/tongfu.net/env/mongodb-4.2.2/bin/mongod-f/tongfu.net/env/mongodb-4.2.2/conf/mongodb.conf--shutdownPrivateTmp=true[Install]WantedBy=multi-user.targetEOF
运行自动启动
systemctlenablemongod#设置自动启动systemctlstartmongod#启动做事systemctlstopmongod#停滞做事systemctlrestartmongod#重启做事
做事命令添加到系统目录
ln-s/tongfu.net/env/mongodb-4.2.2/bin/mongo/usr/bin/
连接数据库admin
首次登录,无需用户名和密码,直接连接 admin 数据库
/tongfu.net/env/mongodb-4.2.2/bin/mongo127.0.0.1:27017/admin
创建超级用户
设置超级用户root
db.createUser({user:"root",pwd:"abcdef",roles:[{role:"readWriteAnyDatabase",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});
重新连接数据库admin
利用超级用户root连接数据库admin
/tongfu.net/env/mongodb-4.2.2/bin/mongo-uroot-pabcdef127.0.0.1:27017/admin
创建数据库
创建数据 field
usefield
插入一条数据到表 field
db.field.insert({"id":1,"uName":"萝卜","age":21})
查询表 field 的所有数据
db.field.find()
插入一条数据到表 logs
db.logs.insert({"id":1,"event":"createrecord"})
查看所有数据库
showdbs
查看所有数据表(凑集)
showcollections
总结
mongodb的数据库实在便是一个根文件夹mongodb的数据表便是根文件夹下的子文件夹mongodb的数据行便是子文件夹下的一个文件,多行数据便是多个文件mongodb的数据没有字段观点,便是一个大JSON数据构造,也便是一个字符串mongodb供应了很多方法去查询这些数据数据导出/导入导出数据
通过下面的命令导出全体数据库
mongodump-u$user-p$passwd-h$host--port$port-d$dbname-o$backupDir
导入数据
通过下面的命令规复全体数据库
把稳:备份出来的目录下面会有备份的数据库的文件夹,要指定到这一级才行
mongorestore-u$user-p$passwd-h$host--port$port-d$dbname$backupDir/$dbname
MongoDB用户管理
创建用户
利用无认证模式启动mongod
选择admin数据库
useadmin
创建root用户
db.createUser({user:"root",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"}]})
利用认证模式重启mongod
用root登录到admin
/tongfu.net/env/mongodb-3.6.2/bin/mongo-uroot-p123456admin
选择test数据库
usetest
为test库创建用户test
db.createUser({user:"test",pwd:"123456",roles:[{role:"dbAdmin",db:"test"},{role:"readWrite",db:"test"}]})
退出root登录
利用test登录到test
/tongfu.net/env/mongodb-3.6.2/bin/mongo-utest-p123456test
修正用户
用root登录到admin
/tongfu.net/env/mongodb-3.6.2/bin/mongo-uroot-p123456admin
选择test数据库
usetest
修正密码
db.updateUser('test',{pwd:"654321"})
删除用户
用root登录到admin
/tongfu.net/env/mongodb-3.6.2/bin/mongo-uroot-p123456admin
选择test数据库
usetest
删除test(居然可以删自己!
!
!
)
db.dropUser('test')
查看用户列表
1、登录到admin数据库
2、选择admin数据库
useadmin
3、查看用户列表
db.system.users.find()
总结
创建、修正、删除用户必须有权限用户可以删除自己!!
!
调度哪个库的用户表要先选择哪个库查看用户列表必须到admin库下操作建议弄一个root超级用户,然后给每个库一个独立账号
用户角色
Read:许可用户读取指天命据库readWrite:许可用户读写指天命据库dbAdmin:许可用户在指天命据库中实行管理函数,如索引创建、删除,查看统计或访问system.profileuserAdmin:许可用户向system.users凑集写入,可以找指天命据库里创建、删除和管理用户clusterAdmin:只在admin数据库中可用,授予用户所有分片和复制集干系函数的管理权限。readAnyDatabase:只在admin数据库中可用,授予用户所有数据库的读权限readWriteAnyDatabase:只在admin数据库中可用,授予用户所有数据库的读写权限userAdminAnyDatabase:只在admin数据库中可用,授予用户所有数据库的userAdmin权限dbAdminAnyDatabase:只在admin数据库中可用,授予用户所有数据库的dbAdmin权限。root:只在admin数据库中可用。超级账号,超级权限
坑爹一
认证失落败的办理方法
刚刚安装好的环境,利用MongoClient去连接做事器,结果去世活报认证缺点。明明是精确的用户名,密码,数据啊~~
从网上查创造旧版本的mongo扩展用的是 MONGODB-CR认证办法。而最新版的MongoDB做事器得用Scram-SHA-1认证办法
好吧,升级mongo扩展到1.6.13,办理了~~
TFAPI操作MongoDB的方法
示例
//引入adodbj包,adodbj为JSON行数据库的统称linking('dbj.adodbj');//连接MongoDB做事器$myDbjObj=newadodbj("driver=mongo;server=localhost;port=27017;uid=field;pwd=abcdef;database=field;charset=utf-8;");//查看数据库列表(须要有访问admin的权限)//$dbArr=$myDbjObj->getDbs();var_dump($dbArr);$condArr=array('domainName'=>array('$regex'=>"ali213",'$options'=>"iq"),);//查询数据数量$ret=$myDbjObj->count("urls",$condArr);$this->showRet($ret,"count");//查询所有数据$ret=$myDbjObj->search("urls",$condArr,0,10,array('_id'=>-1,'domainName'=>-1));foreach($retas$itm){$this->showRet($itm,"search");}//添加记录,ID为1$ret=$myDbjObj->add("urls",array('domainName'=>"www.ali213.net".rand(1111,9999)),1);$this->showRet($ret,"add");//手动添加1000条数据,ID为1+$ifor($i=0;$i<1000;$i++){$ret=$myDbjObj->mod("urls",$i+1,array('domainName'=>"www.ali213.net".rand(1111,9999),'idx'=>rand(111,999)));///$this->showRet($ret,"mod");}//通过mod修正一条数据,ID为1$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('weight'=>33));$this->showRet($ret,"modRange");//查看数据,ID为1$ret=$myDbjObj->get("urls",1);$this->showRet($ret,"get");//查看索引$ret=$myDbjObj->getIndexes("urls");$this->showRet($ret,"getindexes");//创建索引$ret=$myDbjObj->createIndex("urls",array('domainName'=>1));$this->showRet($ret,"createindex");//删除索引$ret=$myDbjObj->dropIndex("urls",array('domainName'=>1));$this->showRet($ret,"dropindex");//打消所有索引$ret=$myDbjObj->dropIndexes("urls");$this->showRet($ret,"dropindexes");
TFAPI操作MongoDB的方法(新)
观点
新版本的MongoDB驱动完备变了样,一样平常情形下我们还是喜好用旧版本的工具怎么办呢?没有关系,官方供应了一个第三方PHP库,封装了新版本的PHP扩展的工具,和老版本的工具及其相似我们TFAPI也将这个库引入了进来,放到了 driver/mongo 下
利用技巧
//引入adodbj包,adodbj为JSON行数据库的统称linking('dbj.adodbj');//连接MongoDB做事器,把稳:这里的driver是mongo2不是mongo了!
MongoDB查询技巧
!
$myDbjObj=newadodbj("driver=mongo2;server=localhost;port=27017;uid=field;pwd=abcdef;database=field;charset=utf-8;");//查看数据库列表(须要有访问admin的权限)//$dbArr=$myDbjObj->getDbs();var_dump($dbArr);$condArr=array('domainName'=>array('$regex'=>"ali213",'$options'=>"iq"),);//查询数据数量$ret=$myDbjObj->count("urls",$condArr);$this->showRet($ret,"count");//查询所有数据$ret=$myDbjObj->search("urls",$condArr,0,10,array('_id'=>-1,'domainName'=>-1));foreach($retas$itm){$this->showRet($itm,"search");}//添加记录,ID为1$ret=$myDbjObj->add("urls",array('domainName'=>"www.ali213.net".rand(1111,9999)),1);$this->showRet($ret,"add");//手动添加1000条数据,ID为1+$ifor($i=0;$i<1000;$i++){$ret=$myDbjObj->mod("urls",$i+1,array('domainName'=>"www.ali213.net".rand(1111,9999),'idx'=>rand(111,999)));///$this->showRet($ret,"mod");}//通过mod修正一条数据,ID为1$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('weight'=>33));$this->showRet($ret,"modRange");//查看数据,ID为1$ret=$myDbjObj->get("urls",1);$this->showRet($ret,"get");//查看索引$ret=$myDbjObj->getIndexes("urls");$this->showRet($ret,"getindexes");//创建索引,只能一个一个创建了$ret=$myDbjObj->createIndex("urls",array('domainName'=>1));$this->showRet($ret,"createindex1");$ret=$myDbjObj->createIndex("urls",array('visits'=>2));$this->showRet($ret,"createindex2");//删除索引,只能一个一个删除了$ret=$myDbjObj->dropIndex("urls",'domainName_1');$this->showRet($ret,"dropindex1");$ret=$myDbjObj->dropIndex("urls",'visits_2');$this->showRet($ret,"dropindex2");//打消所有索引$ret=$myDbjObj->dropIndexes("urls");$this->showRet($ret,"dropindexes");
第一批
//分外查询语句示例//selectfromurlswhereurl='http://tfapi.tongfu.net/'$myDbjObj->search("urls",array('url'=>"http://tfapi.tongfu.net/"));//selectfromurlswhereurllike'tongfu.net'$myDbjObj->search("urls",array('url'=>array('$regex'=>"tongfu.net")));//selectfromurlswherevisit>100andvisit<1000$myDbjObj->search("urls",array('visit'=>array('$gt'=>100,'$lt'=>1000)));//selectfromurlswhereweightbetween3and5$myDbjObj->search("urls",array('weight'=>array('$gte'=>3,'$lte'=>5)));//selectfromurlswhereurlType<>'res'$myDbjObj->search("urls",array('urlType'=>array('$ne'=>"res")));//selectfromurlswhereurlMediaTypein('avi','rmvb','rm')$myDbjObj->search("urls",array('urlMediaType'=>array('$in'=>array("avi","rmvb","rm"))));//selectfromurlswhereurlMediaTypenotin('mov','mp4')$myDbjObj->search("urls",array('urlMediaType'=>array('$nin'=>array("mov","mp4"))));//selectfromurlswherecatchTool='bd'orcatchTimes>0$myDbjObj->search("urls",array('$or'=>array('catchTool'=>"bd",'catchTimes'=>array('$gt'=>0))));$myDbjObj->search("urls",array('urlExtension'=>array('$all'=>array("img","js","css"))));
第二批
//selectfromurlswhere(_idmod5)=1$myDbjObj->search("urls",array('_id'=>array('$mod'=>array(5,1))));//selectfromurlswherenot(catchTimes<100)$myDbjObj->search("urls",array('$not'=>array('catchTimes'=>array('$lt',100))));//数组中元素同时包含fullhead$myDbjObj->search("urls",array('catchType'=>array('$all'=>array('full','head'))));//数组中第2个元素为head$myDbjObj->search("urls",array('catchTypes.1'=>"head"));//数组元素个数是5个$myDbjObj->search("urls",array('catchTypes'=>array('$size'=>5)));//嵌套查询$myDbjObj->search("urls",array('catchInfo.status'=>"fail",'catchInfo.datetime'=>"2018-1-2615:12:11"));//嵌套查询,假定元素是数组的情形下$myDbjObj->search("urls",array('catchInfo',array('$elemMatch'=>array('status'=>"fail",'datetime'=>"2018-1-2615:12:11"))));//繁芜查询情形(这种办法效率比较慢)//只管即便依照正则>MapReduce>$where这个顺序设计$myDbjObj->search("urls",array('$where',"catchTimes>0andcatchType=='head'"));$myDbjObj->search("urls",array('$where',"function(){varresult=catchTimes>0andcatchType=='head';returnresult;}"));//排序,分页实现//根据_id反序排列,同时从100行开始取10行数据$myDbjObj->search("urls",array(),100,10,array('_id'=>-1));
第三批
//将键weightNum的值进行数字增减操作(只能是数字类型)$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$inc'=>array('weightNum'=>1)));$this->showRet($ret,"modRange$inc");//向知足条件的文档设置键weightStr值为high(支持嵌套,请利用点符号)$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$set'=>array('weightStr'=>"high")));$this->showRet($ret,"modRange$set");//从知足条件的文档删除键weight.x(支持嵌套,请利用点符号)$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$unset'=>array('weightStr'=>1)));$this->showRet($ret,"modRange$unset");//向知足条件的文档的键weightRecord数组追加元素值为s1(不检讨重复性)(支持嵌套,请利用点符号)$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$push'=>array('weightRecord'=>"s1")));$this->showRet($ret,"modRange$push");$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$push'=>array('weightRecord'=>"s1")));$this->showRet($ret,"modRange$push");//向知足条件的文档的键weightRecord数组追加元素值为s1(检讨重复性)(支持嵌套,请利用点符号)$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$addToSet'=>array('weightRecord'=>"s1")));$this->showRet($ret,"modRange$addToSet");//向知足条件的文档的键weightRecord数组追加一组元素$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$addToSet'=>array('weightRecord'=>array('$each'=>array("s1","s2","s3")))));$this->showRet($ret,"modRange$each");//利用$pop对键weightRecord数组进行删除元素操作//删除数组末了位置元素$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$pop'=>array('weightRecord'=>1)));$this->showRet($ret,"modRange$pop");//删除数组末了位置元素$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$pop'=>array('weightRecord'=>-1)));$this->showRet($ret,"modRange$pop");//删除数组末了位置元素$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$pop'=>array('weightRecord'=>0)));$this->showRet($ret,"modRange$pop");//删除数组匹配条件的元素$ret=$myDbjObj->modRange("urls",array('_id'=>1),array('$pull'=>array('weightRecord'=>"s2")));$this->showRet($ret,"modRange$pull");
https://m.tongfu.net/home/35/blog/100588.html