MongoDB 是由C++语言编写的,是一个基于分布式文件存储
的开源数据库系统。
在高负载的状况下,添加更多的节点,能够保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档
,数据结构由键值(key=>value)对
组成。MongoDB 文档相似于JSON对象。字段值能够包含其余文档,数组及文档数组。
MongoDB 和关系型数据库相关概念关系对照表:php
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table | joins | 表链接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
use DATABASE_NAME
:若是数据库不存在,则建立数据库,不然切换到指定数据库
db.getName()
或db
:当前正在使用的数据库
show dbs
:查询全部数据库
db.dropDatabase()
:删除当前数据库,默认为 test。其余库先切换。
db.collection.drop()
:删除集合。collection为集合名称。
show tables
或show collection
:查询当前库下全部集合。
db.createCollection(name, options)
:建立集合。name
: 要建立的集合名称;options
: 可选参数, 指定有关内存大小及索引的选项.例:db.createCollection("runoob")
若是 mongo shell不接受集合的名称,例如若是名称中包含空格,连字符”-“,或者以数字开始,你可使用代替语法来指代集合,以下所示:html
>db["3test"].find() db.getCollection("3test").find()
db.stats()
查看数据库使用状态的统计信息。linux
>db.stats() { "db":"test", --查看的是哪一个数据库 "collections":7, --collection数量 "objects":28, --当前数据库中全部集合中的对象数(即文档)的数量。 "avgObjSize":50.57142857142857, --对象平均大小,以字节为单位 "dataSize":1416, --数据大小 "storageSize":31744, --数据大小(含预分配空间) "numExtents":7, --事件数量 "indexes":7, --索引数量 "indexSize":57344, --索引大小 "fileSize":50331648, --文件大小 "ok":1 --本次取stats是否正常 }
简述:文档的数据结构和JSON基本同样。全部存储在集合中的数据都是BSON格式。是一种类json的一种二进制形式的存储格式,简称Binary JSON。命令格式以下:db.COLLECTION_NAME.insert(document)
git
例: >db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
插入的时候若是集合不存在,那么插入操做会建立集合。github
_id
字段:在MongoDB中,存储于集合中的每个文档都须要一个惟一的 _id 字段做为 primary_key。若是一个插入文档操做遗漏了_id
字段,MongoDB驱动会自动为_id
字段生成一个ObjectId
。
这种状况一样适用于经过带有参数 upsert: true 的update操做来插入文档的状况。sql
ObjectId
:
MongoDB采用了一个称之为ObjectId的类型来作主键。ObjectId是一个12字节的 BSON 类型字符串,BSON字符串都是UTF-8编码。按照字节顺序,从开头依次表示:mongodb
- 4字节:UNIX时间戳
- 3字节:表示运行MongoDB的机器的标识符
- 2字节:表示生成此
_id
的进程- 3字节:由一个随机数开始的计数器生成的值
db.collection.insertOne()
: 向集合插入单个文档。db.collection.insertMany()
: 向集合插入多个文档。shell
命令格式以下:数据库
db.collection.update( <query>, // update的查询条件,相似sql update查询内where后面的。 <update>, //update的对象和一些更新的操做符(如$,$inc...)等,也能够理解为sql update 查询内set后面的 { upsert: <boolean>, //可选,这个参数的意思是,若是不存在'update的记录,是否插入objNew,true为插入,默认是false,不插入 multi: <boolean>, // 可选,mongodb 默认是false,只更新找到的第一条记录,若是这个参数为true,就把按条件查出来多条记录所有更新。 writeConcern: <document> //可选,抛出异常的级别。 } )
示例:db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
更新一条数据标题(title)。json
默认状况下, db.collection.update()
只更新一个文档。要更新多个文档,请使用 multi 选项设置 multi 参数为 true。
save()
方法经过传入的文档来替换已有文档。语法格式以下:
db.collection.save( <document>,//文档数据。 { writeConcern: <document> //可选,抛出异常的级别。 } )
_id
字段一旦设定,你不能更新 _id 字段的值,你也不能用有不一样 _id 字段值的替换文档来替换已经存在的文档。
其余命令:db.collection.updateOne()
即便可能有多个文档经过过滤条件匹配到,可是也最多也只更新一个文档。db.collection.updateMany()
更新全部经过过滤条件匹配到的文档。db.collection.replaceOne()
即便可能有多个文档经过过滤条件匹配到,可是也最多也只替换一个文档。
db.collection.find(query, projection)
方法从集合中读取文档,省略过滤条件则是查询全部文档;collection是文档名称。
query :可选,使用查询操做符指定查询条件
projection :可选,使用投影操做符指定返回的键。查询时返回文档中全部键值, 只需省略该参数便可(默认省略)。
db.collection.find().pretty()
:pretty()
方法以格式化的方式来显示全部文档。
除了 find() 方法以外,还有一个 findOne()
方法,它只返回一个文档。
MongoDB 与 RDBMS Where 语句比较
操做 | 格式 | 范例 | RDBMS中的相似语句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt :<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte :<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt :<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte :<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne :<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
包含 | {<key>:{$in :[a,b,c]} |
db.col.find("likes":{$in:[2,4,6]}).pretty() | where likes in(2,4,6) |
不包含 | {<key>:{$nin :[a,b,c]} |
db.col.find("likes":{$nin:[2,4,6]}).pretty() | where likes not in(2,4,6) |
MongoDB AND 条件find()
方法能够传入多个键(key),每一个键(key)以逗号
隔开,即常规 SQL 的 AND 条件。
db.col.find( { "by":"菜鸟教程", "title":"MongoDB 教程" } ).pretty()
MongoDB OR 条件
OR 条件语句使用了关键字 $or
,语法格式以下
>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
>db.col.find( { $or:[ {"by":"菜鸟教程"}, {"title": "MongoDB 教程"} ] } ).pretty()
AND 和 OR 联合使用
>db.col.find( {"likes": {$gt:50}, $or: [ {"by": "菜鸟教程"}, {"title": "MongoDB 教程"} ] } ).pretty()
projection
参数的使用方法
db.collection.find(query, projection)
若不指定 projection,则默认返回全部键,指定 projection 格式以下,有两种模式
- db.collection.find(query, {title: 1, by: 1}) //
inclusion模式
指定返回的键,不返回其余键- db.collection.find(query, {title: 0, by: 0}) //
exclusion模式
指定不返回的键,返回其余键_id 键默认返回,须要主动指定 _id:0 才会隐藏
两种模式
不可混用
(由于这样的话没法推断其余键是否应返回)db.collection.find(query, {title: 1, by: 0}) // 错误
只能全1或全0,除了在inclusion模式时能够指定_id为0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确
MongoDB remove()
函数是用来移除集合中的数据。在执行remove()
函数前先执行find()
命令来判断执行的条件是否正确,这是一个比较好的习惯。
remove() 方法的基本语法格式以下所示:
db.collection.remove( <query>, //(可选)删除的文档的条件。 { justOne: <boolean>, //(可选)若是设为 true 或 1,则只删除一个文档。 writeConcern: <document> //(可选)抛出异常的级别。 } )
如今官方推荐使用
deleteOne()
和deleteMany()
方法。db.inventory.deleteMany({})
:删除集合下所有文档。例如:
删除 status 等于 A 的所有文档: db.inventory.deleteMany({ status : "A" }) 删除 status 等于 D 的一个文档: db.inventory.deleteOne( { status: "D" } )
安装完成以后,Windows下是不会自动生成配置文件,也没有进程。
新建配置文件
- 在mongodb的安装目录下,如
C:\Program Files\MongoDB\Server\3.6
新建conf
目录并新建mongod.conf
文件,配置内容以下:systemLog: #日志文件 destination: file path: F:\mongoDB\logs\mongod.log logAppend: true storage: #数据存储路径 dbPath: F:\data\db journal: enabled: true net:#绑定ip及端口 bindIp: 127.0.0.1 port: 27017 setParameter: enableLocalhostAuthBypass: true #security:#安全认证 #authorization: enabledlog文件也是不存在的,根据本身的须要在相应的目录下新建
mongod.log
文件。开启认证及生成守护进程
mongod --auth --config "C:\Program Files\MongoDB\Server\3.6\conf\mongod.conf" --install --serviceName "MongoD
--auth : 开启认证
--serviceName "MongoDB":生成名称为MongoDB的守护进程
特别注意:账号是跟着库走的,因此在指定库里受权,必须也在指定库里验证(auth)。
配置以前先配置文件不要开启auth
认证,默认为关闭状态。不然进入查看数据库会权限不足。
命令行下执行`mongo
进入数据库
use admin
进入admin库
db.getUsers()
可查看当前库用户列表
执行db.createUser({ user: "admin", pwd: "admin", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
新建用户设置帐户密码,并指定级别。
关于受权:
roles
:指定用户的角色,能够用一个空数组给新用户设定空角色;在roles字段,能够指定内置角色和用户定义的角色。
**role里的可选角色**
:
Built-In Roles(内置角色):
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 全部数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root (有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase))
- 内部角色:__system
具体角色权限:
Read
:容许用户读取指定数据库
readWrite
:容许用户读写指定数据库
dbAdmin
:容许用户在指定数据库中执行管理函数,如索引建立、删除,查看统计或访问system.profile
userAdmin
:容许用户向system.users集合写入,能够找指定数据库里建立、删除和管理用户
clusterAdmin
:只在admin数据库中可用,赋予用户全部分片和复制集相关函数的管理权限。
readAnyDatabase
:只在admin数据库中可用,赋予用户全部数据库的读权限
readWriteAnyDatabase
:只在admin数据库中可用,赋予用户全部数据库的读写权限
userAdminAnyDatabase
:只在admin数据库中可用,赋予用户全部数据库的userAdmin权限
dbAdminAnyDatabase
:只在admin数据库中可用,赋予用户全部数据库的dbAdmin权限。
root
:只在admin数据库中可用。超级帐号,超级权限
修改配置文件:sudo vim /etc/mongodb.conf
security: authorization: enabled //注意缩进,缩进参照配置文件其余配置。缩进错误可能重启不成功
去掉前面的 # 号。
重启mongo服务
/etc/init.d/mongodb restart
从新进入数据库,发现命令没法执行,报权限不足错误。切换到admin库use admin
(哪里建立的用户切换到哪一个库),执行db.auth("admin","admin")
返回1,是认证成功。命令能够正常执行。
注意:MongoDB建立用户在命令行下,而且制定用户能够操做那些库
Windows 安装 MongoDB PHP扩展
MongoDB PHP扩展下载地址
'Thread safe'(线程安全)是运行在Apache上以模块的PHP上,若是你以CGI的模式运行PHP,请选择非线程安全模式(' non-thread safe')。
版本选择参考:
下载完你须要的二进制包后,解压压缩包,将'php_mongo.dll'文件添加到你的PHP扩展目录中(ext)。ext目录一般在PHP安装目录下的ext目录。而后php.ini中打开
重启服务器。
经过浏览器访问phpinfo,若是安装成功,就会看到类型如下的信息:
Linux上安装 MongoDB PHP扩展
linux中执行如下命令来安装MongoDB 的 PHP7
扩展驱动
$ /usr/local/php7/bin/pecl install mongodb
执行成功后,会输出如下结果:
…… Build process completed successfully Installing '/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/mongodb.so' install ok: channel://pecl.php.net/mongodb-1.1.7 configuration option "php_ini" is not set to php.ini location You should add "extension=mongodb.so" to php.ini
下来咱们打开 php.ini 文件,添加 extension=mongodb.so 配置。
能够直接执行如下命令来添加。
$ echo "extension=mongodb.so" >> `/usr/local/php7/bin/php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
注意:以上执行的命令中 php7 的安装目录为 /usr/local/php7/,若是你安装在其余目录,须要相应修改 pecl 与 php 命令的路径。 使用php的
pecl
安装命令必须保证网络链接可用以及root权限。
若是你的php是本身编译的,则安装方法以下(假设是编译在/usr/local/php目录中) github地址:
$ git clone https://github.com/mongodb/mongo-php-driver.git $ cd mongo-php-driver $ git submodule sync && git submodule update --init $ /usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config $ make all -j 5 $ sudo make install
执行以上命令后,你须要修改php.ini
文件,在php.ini文件中添加mongo配置,
配置以下: extension=mongo.so
注意:你须要指明 extension_dir 配置项的路径。
php例子:
<?php //链接数据库 $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); // 插入数据,BulkWrite是批量插入 $bulk = new MongoDB\Driver\BulkWrite; $bulk->insert(['x' => 1, 'name'=>'菜鸟教程', 'url' => 'http://www.runoob.com']); $bulk->insert(['x' => 2, 'name'=>'Google', 'url' => 'http://www.google.com']); $bulk->insert(['x' => 3, 'name'=>'taobao', 'url' => 'http://www.taobao.com']); $manager->executeBulkWrite('test.sites', $bulk); $filter = ['x' => ['$gt' => 1]]; //字段名及匹配条件 $options = [ 'projection' => ['_id' => 0], // 指定返回键,参考上面**projection用法** 'sort' => ['x' => -1], //排序字段,1是正序,-1是倒序 ]; // 查询数据 $query = new MongoDB\Driver\Query($filter, $options); $cursor = $manager->executeQuery('test.sites', $query); foreach ($cursor as $document) { print_r($document); } ?>
在Mongodb中咱们使用mongodump
命令来备份
MongoDB数据。该命令能够导出全部数据到指定目录中。
> mongodump -h HOST_NAME -d DB_NAME -o BACKUP_DIRECTORY
> mongodump --host HOST_NAME --port PORT_NUMBER -d DB_NAME -o BACKUP_DIRECTORY
示例:备份单库
vagrant@homestead:~$ mongodump -h 127.0.0.1 -d DB_NAME -o /root/dbBackup/mongoDB/dbBackupName_$(date +"%Y-%m-%d_%H")也能够备份指定文档:
> mongodump -h dbhost --collection COLLECTION -d DB_NAME -o BACKUP_DIRECTORY
mongorestore
命令来恢复备份的数据。>mongorestore -h <hostname><:port> -d dbname <path>
--host
<:port>,-h
<:port>:
MongoDB所在服务器地址,默认为: localhost:27017--db
,-d
:
须要恢复的数据库实例,例如:test,固然这个名称也能够和备份时候的不同,好比test2--drop
:
恢复的时候,先删除当前数据,而后恢复备份的数据。就是说,恢复后,这份备份文件以后添加或修改的数据都会被删除,慎用哦!<path>
:
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:datadumptest。
你不能同时指定 <path> 和 --dir 选项,--dir也能够设置备份目录。--dir
:
指定备份的目录
你不能同时指定 <path> 和 --dir 选项。
示例:
vagrant@homestead:~$ /usr/local/mongodb/bin/mongodump -h 127.0.0.1:27117 -u USER_NAME -p PASSWORD -d DB_NAME -o /BACK_DIRECTORY/BACKUP_DB_NAME
phpize
命令执行: sudo apt install php7.2-dev
The SCRAM_SHA_1 authentication mechanism requires libmongoc built with ENABLE_SSL
方法:
sudo apt-get install -y libcurl4-openssl-dev pkg-config libssl-dev sudo pecl install mongodb
安装后别忘记在 php.ini 中添加 extension=mongodb.so
重启:sudo service php7.2-fpm restart