mongodb
数据库和mongodb的对比
database | mongodb | 说明 |
---|---|---|
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,mongodb不支持 | |
primary key | primary key | 主键,mongodb自动将_id字段设置为主键 |
优点:高性能、易部署、易使用、存储数据非常方便,能永久存储
缺点:不支持连表查询,不支持sql语句,不支持事务存储过程,所以不适合存储数据间关系比较复杂的数据。
适用于:日志系统,股票数据等。
不适于:电子商务系统等需要连多表查询的功能。
下载
下载地址 https://www.mongodb.com/try/download/community
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.28.tgz
解压安装
①解压
tar zxf mongodb-linux-x86_64-rhel70-4.0.28.tgz
②创建安装目录
mkdir /usr/local/mongodb
③复制到安装目录
cp -r bin/ /usr/local/mongodb/
④创建数据和日志目录
mkdir {data,logs}
⑤创建日志文件
touch logs/dblog
mongodb启动
mongodb启动参数说明
参数 | 说明 | 取值示例 |
dbpath | mongodb数据文件存储路径 | /data/mongodb |
logpath | mongod的日志路径 | /var/log/mongodb/mongodb.log |
logappend | 日志使用追加代替覆盖 | true |
bind_ip | 绑定的IP | 10.10.10.10 |
port | 绑定的端口 | 27107 |
journal | write操作首先写入“日记”,是一个数据安全的设置,具体参考官方文档。 | true |
fork | 以后台的形式运行mongodb | true |
启动示例
[root@VM-24-3-centos mongodb]# ./bin/mongod --dbpath=/usr/local/mongodb/data --fork --logpath=/usr/local/mongodb/logs/dblog --bind_ip=127.0.0.1 about to fork child process, waiting until server is ready for connections. forked process: 20509 child process started successfully, parent exiting |
检查服务是否启动
[root@VM-24-3-centos mongodb]# netstat -tunpl|grep mongo tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 20509/./bin/mongod |
查看进程
[root@VM-24-3-centos mongodb]# ps -ef|grep mongo root 20509 1 0 11:21 ? 00:00:00 ./bin/mongod --dbpath=/usr/local/mongodb/data --fork --logpath=/usr/local/mongodb/logs/dblog --bind_ip=127.0.0.1 root 29493 15435 0 11:27 pts/0 00:00:00 grep --color=auto mongo |
mongodb增删改查
./bin/mongo # 进入mongo客户端 show dbs; 查看所有数据库 db 当前数据库 use xxx; 切换到某个数据库 show tables; 查看当前数据库的集合 增删改查 创建一个集合并且插入一行数据(文档) > db.test.insert({name:"小丽啊"}) WriteResult({ "nInserted" : 1 }) 删除全部 > db.test.remove({}) WriteResult({ "nRemoved" : 2 }) > db.test.remove({name:'xiaoli'}) 按条件删除 WriteResult({ "nRemoved" : 1 }) 更新一行数据,不存在则添加(文档) > db.test.save({_id:1,name:'小丽'}) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 1 }) 查看集合数据 > db.test.find() { "_id" : ObjectId("6263910a88c6461f95e0b216"), "name" : "小丽啊" } 批量插入一些数据 > for(var i=0;i<=100;i++){ ... db.test.insert({name:'user'+i,age:i}) ... } 显示某个字段的查询 > db.test.find({},{name:1}) { "_id" : ObjectId("6263935b88c6461f95e0b217"), "name" : "haha" } { "_id" : ObjectId("6263b23d88c6461f95e0b219"), "name" : "aaaaa" } { "_id" : ObjectId("6263b54388c6461f95e0b21a"), "name" : "user0" } { "_id" : ObjectId("6263b54388c6461f95e0b21b"), "name" : "user1" } 去除_id主键的查询 > db.test.find({},{name:1,_id:0}) 条件表达式查询 < $lt <= $lte > $gt >= $gte != $ne 查询age小于5的数据 db.test.find({age:{$lt:5}}) 查询age大于3小于5的数据 db.test.find({age:{$lt:5,$gt:3}}) in 查询age为1,2,3的数据 db.test.find({age:{$in:[1,2,3]}}) or或 查询age为3或者5的数据 db.test.find({$or:[{age:3},{age:5}]}) 正则模糊查找 > db.test.find({name:/a/i}) # 模糊查找a的字段 { "_id" : ObjectId("6263935b88c6461f95e0b217"), "name" : "haha" } { "_id" : ObjectId("6263b23d88c6461f95e0b219"), "name" : "aaaaa" } count参数为1的时候,只有在使用limit的时候有效 > db.test.find().limit(2).count(1) 2 > db.test.find().limit().count(1) 10000104 > db.test.find().limit(2).count() 10000104 排序查询 字段 1=升序 -1=降序 示例: > db.test.find().sort({age:1}) Error: error: { "ok" : 0, "errmsg" : "Executor error during find command :: caused by :: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.", "code" : 96, "codeName" : "OperationFailed" } 解决方案有两个思路,一个是既然内存不够用那就修改默认配置多分配点内存空间;一个是像错误提示里面说的那样创建索引,或者使用limit。 db.test.find().limit(10).sort({age:1}) 分页查询 skip偏移量数量 limit取出的条数 db.test.find().skip(10).limit(10) 更新 #参数1:条件 #参数2:修改字段或新增字段 #参数3:是否新增 0表示不存在时不添加,存在只修改 1表示不存在时添加,存在时修改 使用默认为0可以 #参数4:是否修改多条 1:条件成立的全部修改,0:修改符合条件最多一条,默认为0 db.test.update({name:'user7'},{$set:{age:888}}) 以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。如下两种: db.test.update({name:'user7'},{$set:{age:888}},{multi:true}) db.test.update({name:'user7'},{$set:{age:999}},0,1) |
mongodb创建用户
默认mongodb启动是不验证用户和密码的,启动mongodb后,可以直接连接上来,可以在启动mongodb服务的时候添加参数–auth来指定使用验证。
mongodb中的用户是对应着数据库来的,首先在没有验证的mongodb服务,进行超级管理员创建。
mongodb内置用户角色
数据库用户角色
read: 只读数据权限
readWrite:读写数据权限
数据库管理角色
dbAdmin: 在当前db中执行管理操作的权限
dbOwner: 在当前db中执行任意操作
userADmin: 在当前db中管理user的权限
备份和还原角色
backup
restore
跨库角色
readAnyDatabase: 在所有数据库上都有读取数据的权限
readWriteAnyDatabase: 在所有数据库上都有读写数据的权限
userAdminAnyDatabase: 在所有数据库上都有管理user的权限
dbAdminAnyDatabase: 管理所有数据库的权限
集群管理
clusterAdmin: 管理机器的最高权限
clusterManager: 管理和监控集群的权限
clusterMonitor: 监控集群的权限
hostManager: 管理Server
超级权限
root: 超级用户
创建一个超级管理员示例:
> db.createUser({ ... user:'admin', ... pwd:'admin888', ... roles:[{role:'root',db:'admin'}] ... }) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] } |
mongodb以需要验证的方式启动
./bin/mongod --dbpath=/usr/local/mongodb/data --fork --logpath=/usr/local/mongodb/logs/dblog --bind_ip=127.0.0.1 --auth ./bin/mongod #进入客户端 > use admin; #切换到admin数据库 switched to db admin > > db.auth('admin','admin888'); #用户验证 1 |
使用use来切换(创建)数据库
use在mongodb数据库命令中,它是一个切换数据库,也是创建数据库的一个命令
use切换数据库,如果数据库存在就是切换,如果数据库不存在就是创建
# 进入到名为php的数据库 use php # 创建一个对应php库的普通账号 > use php; switched to db php > db.createUser({ ... "user":"phpuser", ... "pwd":"phppwd", ... "roles":[{"role":"dbOwner","db":"php"}] ... }) Successfully added user: { "user" : "phpuser", "roles" : [ { "role" : "dbOwner", "db" : "php" } ] } 客户端登录数据库加上验证参数 ./bin/mongo php -uphpuser -pphppwd |
注:账号是与数据库对应的,只有超级管理员才能查看所有库中的数据,在工作中不要分配超级管理员,一般分配数据库的普通账号。
索引
索引是对数据表中的一列或者多列的值进行排序的一种结构,可以让我们查询数据库变得更快。
创建索引
# 单列索引 db.集合名.ensureIndex({字段名:[1/-1]}) # 1是升序 -1是降序 # 复合索引 db.集合名.ensureIndex({field1:1/-1,field2:1/-1}) # 唯一索引 db.集合名.ensureIndex({name:-1},{unique:1}) 示例: > db.test.ensureIndex({name:1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } |
查看索引
db.集合名.getIndexes() > db.test.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 2, "key" : { "name" : 1 }, "name" : "name_1", "ns" : "test.test" } ] |
删除索引
> db.test.dropIndex({name:1}) { "nIndexesWas" : 2, "ok" : 1 } |
数据导出与导入
数据导出
mongoexport -d 库名 -c 集合 -o /usr/local/php.json -h host主机 --port 端口 -d 待导入导出的数据库 -c 待导入导出的集合 -o 指明要导出的文件名 -u username 用户名 -p password 密码 |
注:导出与导入,针对的是集合。
示例:
[root@VM-24-3-centos mongodb]# ./bin/mongoexport -d php -c php -o /usr/local/mongodb/bak/php.php.json -uphpuser -pphppwd 2022-04-24T18:36:07.470+0800 connected to: localhost 2022-04-24T18:36:07.470+0800 exported 1 record [root@VM-24-3-centos mongodb]# ls bak bin data logs [root@VM-24-3-centos mongodb]# cat bak/php.php.json {"_id":{"$oid":"626527a3eacc76b86ccbf1e8"},"name":"aaaa"} |
mongoimport -d 库名 -c 集合 --file ./php.json -h host主机 --port 端口 -d 待导入导出的数据库 -c 待导入导出的集合 --file 备份文件名称包含路径 |
注:导出与导入,针对的是集合。
示例:
[root@VM-24-3-centos mongodb]# ./bin/mongoimport -d php -c hahatable --file /usr/local/mongodb/bak/php.php.json -uphpuser -pphppwd 2022-04-24T19:05:39.999+0800 connected to: localhost 2022-04-24T19:05:40.052+0800 imported 1 document |
安装php mongodb扩展
扩展地址 https://pecl.php.net/package/mongodb
[root@VM-24-3-centos src]# wget https://pecl.php.net/get/mongodb-1.13.0.tgz [root@VM-24-3-centos src]# tar zxf mongodb-1.13.0.tgz [root@VM-24-3-centos src]# cd mongodb-1.13.0 [root@VM-24-3-centos mongodb-1.13.0]# ls config.m4 config.w32 CONTRIBUTING.md CREDITS LICENSE Makefile.frag php_phongo.c php_phongo.h README.md scripts src tests THIRD_PARTY_NOTICES Vagrantfile [root@VM-24-3-centos mongodb-1.13.0]# phpize # 运行php安装目录下的phpize文件,这时候会在extension目录下生成相应的configure文件。 Configuring for: PHP Api Version: 20151012 Zend Module Api No: 20151012 Zend Extension Api No: 320151012 [root@VM-24-3-centos mongodb-1.13.0]# ./configure --with-php-config=/www/server/php/70/bin/php-config # # 运行配置,如果你的服务器上只是装了一个版本的php则不需要添加--with-php-config 。后面的参数只是为了告诉phpize要建立基于哪个版本的扩展。 [root@VM-24-3-centos mongodb-1.13.0]# make && make install # 编译 Build complete. Don't forget to run 'make test'. Installing shared extensions: /www/server/php/73/lib/php/extensions/no-debug-non-zts-20180731/ [root@VM-24-3-centos mongodb-1.13.0]# ls /www/server/php/73/lib/php/extensions/no-debug-non-zts-20180731/ mongodb.so opcache.a opcache.so zip.so [root@VM-24-3-centos php]# cd /www/server/php/73/etc [root@VM-24-3-centos etc]# ls pear.conf php-fpm.conf php-fpm.conf.default php-fpm.d php.ini [root@VM-24-3-centos etc]# vi php.ini 文件底部添加 extension=mongodb.so |
作用
其实phpize是一个运行脚本,主要作用是检测php的环境还有就是在特定的目录生成相应的configure文件,这样makeinstall之后,生成的.so文件才会自动加载到php扩展目录下面。
configure
configure文件其实就是个shell脚本,phpize会把检测的php环境信息放到configure里面
composer安装mongodb包
/www/server/php/73/bin/php /usr/bin/composer require mongodb/mongodb php mongodb 文档地址 https://www.mongodb.com/docs/php-library/current/tutorial/crud/#insert-documents <?php include __DIR__.'/vendor/autoload.php'; $client = new MongoDB\Client("mongodb://phpuser:phppwd@127.0.0.1:27017/php"); $client->php->hahatable->insertOne([ 'username' => 'admin', 'email' => 'admin@example.com', 'name' => 'Admin User', ]); |