MongoDB 学习

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

1、MongoDB 简介

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

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

clipboard.png

2、Linux平台安装MongoDB

1.下载安装

下载地址: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/mongodbshell

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 来指定。php7

$ ./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

2、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":"菜鸟教程"}

3、MongoDB数据库建立和删除

一、建立

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

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

5、PHP7 MongDB 安装与使用

本文教程只适合在 PHP7 的环境,若是你是 PHP5 环境,你能够参阅

PHP MongDB 安装与使用。

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