MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。php
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。linux
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档相似于 JSON 对象。字段值能够包含其余文档,数组及文档数组。git
下载地址:https://www.mongodb.com/downl...web
下载完安装包,并解压 tgz(如下演示的是 64 位 Linux上的安装。sql
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz # 下载 tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解压 sudo mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 将解压包拷贝到指定目录
MongoDB 的可执行文件位于 bin
目录下,因此能够将其添加到 PATH
路径中:mongodb
export PATH=<mongodb-install-directory>/bin:$PATH // 即,这样的 export PATH=/usr/local/mongodb/bin:$PATH
<mongodb-install-directory> 为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb
。shell
MongoDB的数据存储在data目录的db目录下,可是这个目录在安装过程不会自动建立,因此你须要手动建立data目录,并在data目录中建立db目录。
如下实例中咱们将data目录建立于根目录下(/)。
注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。数据库
mkdir -p /data/db
你能够再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。数组
注意:若是你的
数据库目录
不是/data/db
,能够经过--dbpath
来指定。php7
$ ./mongod
98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission
若是出现这样的问题,能够,使用下边的命令进行权限修改:
sudo chown -R `id -u` /data/db
若是你须要进入MongoDB后台管理,你须要先打开mongodb装目录的下的bin目录,而后执行mongo命令文件。
MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操做和管理的交互式环境。
当你进入mongoDB后台后,它默认会连接到 test 文档(数据库):
重开一个窗口,而后进入MongoDB后台
$ cd /usr/local/mongodb/bin $ ./mongo MongoDB shell version: 3.0.6 connecting to: test Welcome to the MongoDB shell. ……
让咱们插入一些简单的数据,并对插入的数据进行检索:
> db.corwien.insert({name:'corwien'}) WriteResult({ "nInserted" : 1 }) > db.corwien.find() { "_id" : ObjectId("5942b5a247b748bc9bd3276a"), "name" : "corwien" } >
第一个命令将name 'corwien' 插入到 corwien 集合的 name 字段中。
MongoDB 提供了简单的 HTTP 用户界面。 若是你想启用该功能,须要在启动的时候指定参数 --rest 。
$ ./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面访问端口比服务的端口多1000。
若是你的MongoDB运行端口使用默认的27017,你能够在端口号为28017访问web用户界面,即地址为:http://localhost:28017。
无论咱们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面咱们挨个介绍。
下表将帮助您更容易理解Mongo中的一些概念:
经过下图实例,咱们也能够更直观的的了解Mongo中的一些概念:
一个mongodb中能够创建多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例能够容纳多个独立的数据库,每个都有本身的集合和权限,不一样的数据库也放置在不一样的文件中。
"show dbs" 命令能够显示全部数据的列表。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > show dbs local 0.078GB test 0.078GB >
执行 db
命令能够显示当前数据库对象或集合。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > db test >
运行use
命令,能够链接到一个指定的数据库。
> use local switched to db local > db local >
文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不须要设置相同的字段,而且相同的字段不须要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 很是突出的特色。
一个简单的文档例子以下:
{"site":"www.runoob.com", "name":"菜鸟教程"}
use DATABASE_NAME
若是数据库不存在,则建立数据库,不然切换到指定数据库
。
> use books switched to db books > show dbs local 0.078GB test 0.078GB > db.info.insert({"name":"Jack Ma"}) WriteResult({ "nInserted" : 1 }) > show dbs books 0.078GB local 0.078GB test 0.078GB
能够看到,咱们刚建立的数据库 runoob 并不在数据库的列表中, 要显示它,咱们须要向 runoob 数据库插入一些数据。
MongoDB 删除数据库的语法格式以下:
db.dropDatabase()
删除当前数据库,默认为 test,你可使用 db
命令查看当前数据库名。
> show dbs books 0.078GB local 0.078GB test 0.078GB > db.dropDatabase() { "dropped" : "books", "ok" : 1 } > show dbs local 0.078GB test 0.078GB > use test
解释几个缩写吧,省得你们幸苦寻找:
$gt -------- greater than $gte --------- gt equal $lt -------- less than $lte --------- lt equal $ne ----------- not equal
文档插入数据:
> db.users.insert({"address":{"city":"guangzhou","state":"guangdong"},"tags":["music","cricket","blogs"],}) WriteResult({ "nInserted" : 1 })
查看:
> db.users.find().pretty(); { "_id" : ObjectId("5943a224b4c9662dcc837ba0"), "name" : "kaiyi", "address" : "beijing" } { "_id" : ObjectId("5943b6cfb4c9662dcc837ba1"), "address" : { "city" : "guangzhou", "state" : "guangdong" }, "tags" : [ "music", "cricket", "blogs" ] }
给数组tags 添加索引:
为数组 tags 建立索引时,会为 music、cricket、blogs三个值创建单独的索引。
> db.users.ensureIndex({"tags":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
建立索引后,咱们能够这样检索集合的 tags 字段:
> db.users.find({tags:"cricket"}) { "_id" : ObjectId("5943b6cfb4c9662dcc837ba1"), "address" : { "city" : "guangzhou", "state" : "guangdong" }, "tags" : [ "music", "cricket", "blogs" ] } >
为了验证咱们使用使用了索引,可使用 explain 命令:
> db.users.find({tags:"cricket"}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.users", "indexFilterSet" : false, "parsedQuery" : { "tags" : { "$eq" : "cricket" } }, "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "tags" : 1 }, "indexName" : "tags_1", "isMultiKey" : true, "direction" : "forward", "indexBounds" : { "tags" : [ "[\"cricket\", \"cricket\"]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "homestead", "port" : 27017, "version" : "3.0.6", "gitVersion" : "1ef45a23a4c5e3480ac919b28afcba3c615488f2" }, "ok" : 1 } >
其余查询语句解释:
db.col.find({},{"title":1,_id:0}).limit(2)
补充说明:
第一个 {} 放 where 条件,为空表示返回集合中全部文档。
第二个 {} 指定那些列显示和不显示 (0表示不显示 1表示显示)。
> db.col.find({},{"title":1,_id:0}).limit(2) { "title" : "PHP 教程" } { "title" : "Java 教程" }
想要读取从 10 条记录后 100 条记录,至关于 sql 中limit (10,100)。
> db.COLLECTION_NAME.find().skip(10).limit(100)
以上实例在集合中跳过前面 10 条返回 100 条数据。skip
和 limit
结合就能实现分页。
当查询时同时使用sort,skip,limit,不管位置前后 最后执行顺序 sort再skip再limit
。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
以上实例相似sql
语句:
select by_user as _id, count(*) as num_tutorial from mycol group by by_user
本文教程只适合在 PHP7 的环境,若是你是 PHP5 环境,你能够参阅
PHP MongDB 安装与使用。
咱们使用 pecl 命令来安装:
文件下载的地址在:
/tmp/pear/download/mongodb-1.2.9.tgz
// $ /usr/local/php7/bin/pecl install mongodb pecl install mongodb
擦,出现这样的错误
sudo apt-get install php7.0-mongodb
on terminal. For the OpenSSL error, try this
sudo apt-get install openssl