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',
]); |