数据库和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',
]);

发表评论

邮箱地址不会被公开。 必填项已用*标注