2

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

一、MongoDB 简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

clipboard.png

二、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

clipboard.png

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.
……

clipboard.png

让我们插入一些简单的数据,并对插入的数据进行检索:

> 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中的一些概念:

clipboard.png

通过下图实例,我们也可以更直观的的了解Mongo中的一些概念:

clipboard.png

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 条数据。
skiplimit 结合就能实现分页。

当查询时同时使用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

擦,出现这样的错误

clipboard.png


sudo apt-get install php7.0-mongodb

on terminal. For the OpenSSL error, try this

sudo apt-get install openssl


Corwien
6.3k 声望1.6k 粉丝

为者常成,行者常至。


« 上一篇
PHP源码研究
下一篇 »
Go基础学习