MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
一、MongoDB 简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
二、Linux平台安装MongoDB
1.下载安装
下载地址:https://www.mongodb.com/downl...
下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装。
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
路径中:
export PATH=<mongodb-install-directory>/bin:$PATH
// 即,这样的
export PATH=/usr/local/mongodb/bin:$PATH
<mongodb-install-directory> 为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb
。
2.创建数据库目录
MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。
以下实例中我们将data目录创建于根目录下(/)。
注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。
mkdir -p /data/db
3.命令行中运行 MongoDB 服务
你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。
注意:如果你的
数据库目录
不是/data/db
,可以通过--dbpath
来指定。
$ ./mongod
98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission
如果出现这样的问题,可以,使用下边的命令进行权限修改:
sudo chown -R `id -u` /data/db
4.MongoDB后台管理 Shell
如果你需要进入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 字段中。
5.MongoDb web 用户界面
MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest 。
$ ./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面访问端口比服务的端口多1000。
如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:http://localhost:28017。
二、MongoDB概念解析
1.MongoDB和SQL语句比较
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。
下表将帮助您更容易理解Mongo中的一些概念:
通过下图实例,我们也可以更直观的的了解Mongo中的一些概念:
2.数据库
一个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
>
3.文档
文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子如下:
{"site":"www.runoob.com", "name":"菜鸟教程"}
三、MongoDB数据库创建和删除
1、创建
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 数据库插入一些数据。
2、删除
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
四、MongoDB 插入文档
解释几个缩写吧,免得大家幸苦寻找:
$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 MongDB 安装与使用
本文教程只适合在 PHP7 的环境,如果你是 PHP5 环境,你可以参阅
PHP MongDB 安装与使用。
1、PHP7 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。