mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与还原、监控等等)

终极更新时间:2017-07-13 11:10:49

原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/

MongoDB – 简介

官网:https://www.mongodb.com/

MongoDB 是一个根据分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB
应用提供可扩大的过人性能数据存储解决方案。

MongoDB
是一个在关系数据库和无关系数据库之间的活,是非关系数据库当中作用最丰富,最像关系数据库的。

图片 1

MongoDB – 安装与运行

  1. 下载

07/05/2017 Current Stable Release (3.4.6)

https://www.mongodb.com/download-center#community

  1. 创建数量目录

MongoDB 将数据目录存储在 db 目录下,需手动创建。

E:\MongoDB\data\db
  1. 运行 MongoDB 服务器

为从命提示符下运行MongoDB服务器,你得于MongoDB\bin目录中执行mongod.exe文本,不要关服务。ctrl + c关闭。

mongod.exe --dbpath E:\MongoDB\data\db
  1. MongoDB 后台管理

运行 mongo.exe

MongoDB Shell是MongoDB自带的交互式Javascript
shell,用来针对MongoDB进行操作和保管的交互式环境。

  1. 用 MongoDB 服务器作为 Windows 服务运行

加加系统环境 path E:\MongoDB\Server\3.4\bin

检测:cmd 中输入 mongod --help

新建文件:E:\MongoDB\logs\logs.log

以 MongoDB 服务器作为 Windows 服务按 Windows 启动而打开:

mongod.exe --logpath "E:\MongoDB\logs\logs.log" --logappend --dbpath "E:\MongoDB\data" --directoryperdb --serviceName MongoDB --install

开启 MongoDB 服务:net start MongoDB

停止 MongoDB 服务:net stop MongoDB

删除 MongoDB 服务:sc delete MongoDB

对接下去便可以 cmd
中运作 E:\MongoDB\Server\3.4\bin 里面的 *.exe 程序了

  • shell 控制台 mongo
  • 数据库的还原 mongorestore
  • 备份 mongodump

  • mongodb 启动之参数

图片 2

mongoDB – 主要特色

  • MongoDB安装简便。
  • MongoDB的提供了一个面向文档存储,没有说明结构的定义,每天记录可以起了两样之布局,操作起来比较简单和爱。
  • 一心的目支持(单键索引、数组索引、全文索引、地理位置索引 等)
  • 公可以经本地或网络创建数量镜像,这让MongoDB有重强的扩展性。
  • 如果负载的增(需要还多之仓储空间与重复胜似的拍卖能力)
    ,它好分布于处理器网络中的其他节点上这即是所谓的分片。
  • Mongo支持添加的询问表达式。查询指令以JSON形式的标志,可随便查询文档中内嵌的目标和数组。
  • MongoDb
    以update()命令可以兑现替换完成的文档(数据)或者部分指定的数字段
  • Mongodb中的Map/reduce主要是为此来对数码进行批量处理与集操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中享有的笔录,将key与value传给Reduce函数进行拍卖。
  • Map函数和Reduce函数是使Javascript编写的,并可以由此db.runCommand或mapreduce命令来实行MapReduce操作。
  • GridFS是MongoDB中之一个放功能,可以用于存放大量稍微文件。
  • MongoDB允许以服务端执行脚本,可以用Javascript编写某个函数,直接当服务端执行,也堪拿函数的概念存储于服务端,下次直接调用即可。
  • MongoDB 支持多编程语言:C C++ C# .NET Erlang Haskell Java
    JavaScript Lisp node.JS Perl PHP Python Ruby Scala 等

mongoDB – 工具

监控

  • Munin:网络及系统监控工具
  • Gangila:网络以及系统监控工具
  • Cacti:用于查看CPU负载, 网络带富利用率,它为提供了一个以被监控
    MongoDB 的插件。

GUI

  • Robomongo(Robo 3T)
  • Fang of Mongo – 网页式,由Django和jQuery所构成。
  • Futon4Mongo – 一个CouchDB Futon web的mongodb山寨版。
  • Mongo3 – Ruby写成。
  • MongoHub – 适用于OSX的应用程序。
  • Opricot – 一个基于浏览器的MongoDB控制台, 由PHP撰写而成。
  • Database Master — Windows的mongodb管理工具
  • RockMongo — 最好的PHP语言的MongoDB管理工具,轻量级, 支持多国语言.

mongoDB – 三深重点概念

图片 3

1. database 数据库

基本上单集逻辑上组织以一块儿,就是数据库。

数据库命名规范:

  • 非克是空字符串(””)。
  • 不得含有’ ‘(空格)、.、$、/、\和\0 (空字符)。
  • 答应总体大写。
  • 最多64字节。

来部分数据库名是保留的,可以直接访问这些发生特殊作用的数据库。

  • admin:
    从权力的角度来拘禁,这是”root”数据库。要是将一个用户增长到此数据库,这个用户自行连续所有数据库的权位。一些特定的服务器端命令也只能于者数据库运行,比如列出所有的数据库或者关闭服务器。
  • local:
    这个数永远不见面让复制,可以就此来存储限于本地单台服务器的随意集合
  • config:
    当Mongo用于分片设置时,config数据库在内部用,用于保存分片的相干信息。

  • collection 集合


大抵单文档组成一个集,相当给关系数据库的发明。

怀有存储于聚集中之数额还是 BSON 格式,BSON 是看似 JSON
的均等种二进制形式的存储格式,简称 Binary JSON。

集合名命名规范:

  • 集合名不克是空字符串””。
  • 集合名不可知含有\0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不可知为”system.”开头,这是也系统集结保留的前缀。
  • 用户创建的聚合名字不能够含有保留字符。有些驱动程序的确支持于集合名里面含有,这是因一些系统生成的汇聚中含该字符。除非你要拜这种系统创造的集结,否则千万不要以名字里出现$。 

图片 4

3. document 文档

MongoDB 将数据存储吗一个文档,数据结构由键值对组合。

MongoDB 文档是同等组键值对(即BSON,二进制的 JSON),类似于 JSON
对象。字段值可以分包其他文档,数组及文档数组。

文档键命名规范:

  • 键不能够含有\0 (空字符)。这个字符用来代表键的结尾。
  • .和$有特别之含义,只有以特定环境下才会采取。
  • 以下划线”_”开头的键是保留的(不是严格要求的)。

需要注意的凡:

  • 文档中之键值对凡雷打不动的。
  • 文档中的价不仅可以是于双引号里面的字符串,还好是另几种植多少列(甚至可是整套嵌入的文档)。
  • MongoDB区分类型和大小写。
  • MongoDB的文档不克产生再度的键。
  • 文档的键是字符串。除了少数例外情况,键可以应用任意UTF-8字符。

图片 5

image

图片 6

image

MongoDB – 数据类型

ObjectId:主键,一种植特有而死关键之色,每个文档都见面默认配置是特性,属性名也_id,除非自己定义,方可覆盖

图片 7

MongoDB – 常见操作

查看时数据库

db

查有数据库

无数的数据库不予显示

MongoDB 中默认的数据库也 test,如果您从未开创新的数据库,集合将存放于
test 数据库中。

show dbs

连天至指定的数据库

万一数据库不设有,则创造数据库,否则切换到指定数据库。

use db_name

翻开服务器状态

db.serverStatus()

翻看数据库统计信息

db.stats()

剔除数据库

db.dropDatabase()

查阅数据库中存有集合

show tables
或
show collections

清空集合

除去里面的文档,但凑还于

db.col_name.remove({})

抹集合

db.col_name.drop()

翻开集合详细信息

MongoDB 的3.0晚底版分了三种植模式
queryPlanner、executionStats、allPlansExecution

db.col_name.find({key:value}).explain("allPlansExecution")

MongoDB – 增删改查

插入

MongoDB 用 insert() 或 save() 方法向聚集中插入文档:

假若该集不以拖欠数据库中, MongoDB 会自动创建该集合并插入文档。

insert() 或 save() 方法还好于collection里安插入数据,两者分别:

  • 假使不依靠定 _id 字段,save()
    方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id
    的数据。
  • 运用save函数,如果原本的对象非有,那她们都得以往collection里插入数据,如果都在,save会调用update更新中的记录,而insert则会忽视操作
  • insert可以一次性插入一个列表,而无用遍历,效率高,
    save则需遍历列表,一个个插入。

db.col_name.insert(document)

db.col_name.save(document)

安插一个文档到 col 集合中:

db.col_1.insert({
    title: 'MongoDB 教程',
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

啊堪以文档数据定义也一个变量,如下所示:

document = ({
    title: 'MongoDB 教程',
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
});

db.col_2.insert(document)

删除

remove() 函数是用来删除集合中之数码

于实践 remove() 函数前先实行 find()
命令来判定执行之尺度是否科学,这是一个比好的习惯。

db.col_name.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。

去除集合中有着文档

db.col.remove({})

移除 col_1 集合中 title 为 MongoDB save 的文档,只去第一长长的找到的记录

db.col_1.remove({'title':'MongoDB save'}, 1)

更新

MongoDB 用 update() 和 save() 方法来更新集合中的文档

update() 方法用于创新就在的文档

db.col_name.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

- query : update 的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在 update 的记录,是否插入记录,true 为插入,默认是 false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。

通过 update() 方法来更新 col_1 集合中的 title

$set 操作符为部分更新操作符,只更新 $set
之后的数据,而不是覆盖前的数量

db.col_1.update({ 'title': 'MongoDB 教程' }, { $set: { 'title': 'MongoDB' } })

以上语句只见面修改第一条发现的文档,如果要是修改多久相同的文档,则需安装
multi 参数为 true。

db.col_1.update({ 'title': 'MongoDB 教程' }, { $set: { 'title': 'MongoDB' } }, { multi: true })

save()
方法通过传播的文档来替换已发生文档。语法格式如下:

db.col_name.save(
   <document>,
   {
     writeConcern: <document>
   }
)

以下实例中我们轮换了 col_1 的文档数据:

document = ({
    "_id": "1",
    "title": "MongoDB save",
    "description": "MongoDB 是一个 Nosql 数据库",
    "by": "菜鸟",
    "url": "http://www.runoob.com",
    "tags": ["mongodb", "database", "NoSQL"],
});

db.col_1.save(document)

查询

find() 方法,它回到集合中持有文档。

findOne() 方法,它只有回一个文档。

db.col_name.find(query, projection)

- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

格式化输出:

db.col_name.find().pretty()

查集合中文档的个数:

db.col_name.find().count()

跳过指定数量的数目:

db.col_name.find().skip()

读取指定记录之条数:

db.col_name.find().limit()

排序:

sort()方法好经过参数指定排序的字段,并利用 1 和 -1
来指定排序的点子,其中 1 为升序排列,而-1凡用来降序排列。

db.col_name.find().sort({key:1})

sort()方法可以经参数指定排序的字段,并以 1 和 -1
来指定排序的法,其中 1 为升序排列,而-1凡用来降序排列。

Where 语句

如若您想取得”col”集合中 “likes” 大于100,小于 200
的数,你得利用以下命令:

db.col.find({likes : {$lt :200, $gt : 100}})

// 类似于SQL语句:
Select * from col where likes>100 AND  likes<200;
条件操作符 中文 全英文
$gt 大于 greater than
$gte 大于等于 greater than equal
$lt 小于 less than
$lte 小于等于 less than equal
$ne 不等于 not equal

图片 8

$type 操作符

故而来找集合中相当的数据类型

图片 9

假设想得 “col” 集合中 title 为 String 的多寡,你可以动用以下命令:

db.col.find({"title" : {$type : 2}})

AND 条件

find() 方法可流传多单键(key),每个键(key)以逗号隔开,语法格式如下:

db.col_name.find({key1:value1, key2:value2}).pretty()

// 类似于 SQL and 语句:
SELECT * FROM col_name WHERE key1='value1' AND key2=value2

OR 条件

db.col_name.find({ $or: [{ "by": "菜鸟教程" }, { "title": "MongoDB 教程" }] }).pretty()

// 类似于 SQL or 语句:
SELECT * FROM col_name WHERE key1=value1 OR key2=value2

AND 和 OR 联合使用

db.col_name.find({
    "likes": {
        $gt: 50
    },
    $or: [{
        "by": "菜鸟教程"
    }, {
        "title": "MongoDB 教程"
    }]
}).pretty()

// 类似常规 SQL 语句:
SELECT * FROM col_name where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')

MongoDB – 索引

留意:从 mongoDB 3.0 开始,ensureIndex 被抛,今后且单是
createIndex
的一个号。

目录通常能够大幅度的==提高查询的频率==,如果无索引,MongoDB在读取数据时要扫描集合中的每个文件并摘那些符合查询条件的记录。

这种扫描都集合的查询效率是格外小之,特别在拍卖大量之数额常常,查询好使花几十秒甚至几分钟,这对准网站的性质是那个沉重之。

目是特之数据结构,索引存储在一个便于遍历读取的数码集合中,索引是指向数据库表中一律排列或多排的价进行排序的平等栽结构

目录常用命令

getIndexes 查看集合索引情况

db.col_name.getIndexes()

hint 强制行使索引

db.col_name.find({age:{$lt:30}}).hint({name:1, age:1}).explain()

去索引(不会见去 _id 索引)

db.col_name.dropIndexes()

db.col_name.dropIndex({firstname: 1})

createIndex() 方法

MongoDB使用 createIndex() 方法来创造索引

key 为而要开创的索引字段,1吧遵循升序创建索引,-1乎仍降序创建索引。

也可装以多单字段创建索引(关系项目数据库中称作复合索引)

db.col_name.createIndex({key:1})

createIndex() 接收可选参数,可摘参数列表如下:

图片 10

_id 索引

对于每个插入的多少,都见面自动生成一长达唯一的 _id 字段,_id
索引是绝大多数成团默认建立之目录

> db.col_1.insert({x:10})
WriteResult({ "nInserted" : 1 })

> db.col_1.find()
{ "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 }

> db.col_1.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "runoob.col_1"
        }
]

字段解释:

  • v 表示 version,在 Mongo3.2 之前的版中,会有
    {v:0}(版本锁为0)的情况。在3.2随后的本子被,{v:0}
    不再允许采取,这有足不错过关心,因为 v 由系统自动管理

  • key 代表作为目录的键。1 要么 -1表示排序模式,1啊升序,1啊降序

  • name 表示索引的讳,默认生成名称的规则是作为索引的字段_排序模式

  • ns 表示 namespace 命名空间,由数据库名称.集合名称组成

单键索引

极致常见的目录,不见面自动创建

// 对 x 字段创建升序索引

> db.col_1.createIndex({x:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

> db.col_1.find()
{ "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 }

> db.col_1.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "runoob.col_1"
        },
        {
                "v" : 2,
                "key" : {
                        "x" : 1
                },
                "name" : "x_1",
                "ns" : "runoob.col_1"
        }
]

大多键索引

单键索引的值吗一个纯净的价值,多键索引的价有多单数据(如数组)

假若mongoDB中插数组类型的多键数据,索引是全自动建立之,无需刻意指定

> db.col_1.insert({z:[1,2,3,4,5]})
WriteResult({ "nInserted" : 1 })

> db.col_1.find()
{ "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 }
{ "_id" : ObjectId("5965923eaaf42d1c98dd95a3"), "y" : 20 }
{ "_id" : ObjectId("59659828aaf42d1c98dd95a4"), "z" : [ 1, 2, 3, 4, 5 ] }

> db.col_1.find({z:3})
{ "_id" : ObjectId("59659828aaf42d1c98dd95a4"), "z" : [ 1, 2, 3, 4, 5 ] }

复合索引

又对大多只字段创建索引

> db.col_2.insert({x:10,y:20,z:30})
WriteResult({ "nInserted" : 1 })

> db.col_2.find()
{ "_id" : ObjectId("59659a57aaf42d1c98dd95a5"), "x" : 10, "y" : 20, "z" : 30 }

> db.col_2.createIndex({x:1,y:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

> db.col_2.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "runoob.col_2"
        },
        {
                "v" : 2,
                "key" : {
                        "x" : 1,
                        "y" : 1
                },
                "name" : "x_1_y_1",
                "ns" : "runoob.col_2"
        }
]

过期索引

再就是如 TTL(Time To
Live,生存时间)索引,即于一段时间后会过的目录(如登录信息、日志等)

过期晚底索引会连同文档一起去

expireAfterSeconds:指定一个坐秒为单位的数值,设定集合的活时间。

注意:

  • 存储于了期索引字段的价值必须是点名的时刻项目(必须是 ISODate 或
    ISODate 数组,不可知使时戳,否则不能够于自动删除)
  • 使指定了 ISODate 数组,则仍最小之时光进行删除
  • 过期索引不可知是复合索引(不能够指定两独过时)
  • 去时是多少误差(1 分钟左右)

> db.col_3.insert({x:new Date()})
WriteResult({ "nInserted" : 1 })

> db.col_3.find()
{ "_id" : ObjectId("59659f3baaf42d1c98dd95a7"), "x" : ISODate("2017-07-12T04:02:03.835Z") }

> db.col_3.createIndex({x:1},{expireAfterSeconds:10})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

> db.col_3.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "runoob.col_3"
        },
        {
                "v" : 2,
                "key" : {
                        "x" : 1
                },
                "name" : "x_1",
                "ns" : "runoob.col_3",
                "expireAfterSeconds" : 10
        }
]

> db.col_3.find()
// 无返回

全文索引

情景:全网站关键词搜索

key-value 中,key 此时为 $**(也堪是切实有 key),value
这也一个固定的字符串(如 text

全文索引相似度,与 sort 函数一起利用力量还好

db.col_7.find({ $text: { $search: "aa bb" } }, { score: { $meta: "textScore" } }).sort({ score: { $meta: "textScore" } })

注意:

  • 每个集合只能创造一个全文索引
  • MongoDB 从 2.4 版本开始支持全文检索,从 3.2 版本开始支持中文
  • (好像)只能对合单词查询,不克针对单词的截取部分查询
  • 着重词里的空格表示
  • 最主要词之前的 – 表示
  • 重中之重词加引号表示 (需用 \ 转义)

> db.col_7.find()
{ "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }
{ "_id" : ObjectId("5965aa8faaf42d1c98dd95b1"), "title" : "abc def", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }
{ "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }

> db.col_7.createIndex({"title": "text"})

> db.col_7.find({$text:{$search:"aa"}})
{ "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }
{ "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }

> db.col_7.find({$text:{$search:"aa cc"}})
{ "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }
{ "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }

> db.col_7.find({$text:{$search:"\"aa\" \"cc\""}})
{ "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }

> db.col_7.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
{ "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》", "score" : 1.5 }
{ "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》", "score" : 1.3333333333333333 }


> db.col_7.dropIndexes()

> db.col_7.createIndex({"author": "text"}))

> db.col_7.find({$text:{$search:"小明"}})})
>

> db.col_7.find({$text:{$search:"白小明"}})
{ "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }
{ "_id" : ObjectId("5965aa8faaf42d1c98dd95b1"), "title" : "abc def", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }
{ "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "这是白小明的一篇文章,标题《aa bb cc》" }

地理位置索引

查阅最近之接触

MongoDB – 聚合

==分组计算==

MongoDB
中汇聚主要用于拍卖多少(如平均值,求与相当),并回计算后底多少结果。类似sql语句被的
count(*)。

aggregate() 方法

db.col_name.aggregate(AGGREGATE_OPERATION)

下表展示了有些会合的表达式:

图片 11

实例

算每个作者所描绘的章数

当底下的例证中,我们由此字段by_user字段对数码进行分组,并盘算by_user字段相同值的总额。

汇聚中的多寡如下:

{
        "_id" : ObjectId("5963b992a812aa05b9d2e765"),
        "title" : "MongoDB Overview",
        "description" : "MongoDB is no sql database",
        "by_user" : "runoob.com",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
{
        "_id" : ObjectId("5963b9aaa812aa05b9d2e766"),
        "title" : "NoSQL Overview",
        "description" : "No sql database is very fast",
        "by_user" : "runoob.com",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 10
}
{
        "_id" : ObjectId("5963b9bba812aa05b9d2e767"),
        "title" : "Neo4j Overview",
        "description" : "Neo4j is no sql database",
        "by_user" : "Neo4j",
        "url" : "http://www.neo4j.com",
        "tags" : [
                "neo4j",
                "database",
                "NoSQL"
        ],
        "likes" : 750
}

以aggregate()计算结果如下:

db.col_1.aggregate([{
    $group: {
        _id: "$by_user",
        num_tutorial: {
            $sum: 1
        }
    }
}])

// 返回
{ "_id" : "Neo4j", "num_tutorial" : 1 }
{ "_id" : "runoob.com", "num_tutorial" : 2 }

// 以上实例类似sql语句
select by_user, count(*) from col_1 group by by_user

集结管道

管道在Unix和Linux中貌似用于将目前命令的出口结果当下一个下令的参数。

MongoDB
的聚合管道用MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是足以重复的。

表达式:处理输入文档并出口。表达式是无论状态的,只能用于计算时聚集管道的文档,不可知处理其他的文档。

汇管道常用之几单操作:

  • $project:修改输入文档的组织。可以为此来再次命名、增加还是删除域,也可用来创造计算结果及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的专业查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在汇聚管道被超过了指定数量之文档,并返余下的文档。
  • $unwind:将文档中的某部一个数组类型字段拆分成多漫漫,每条包含数组中的一个价值。
  • $group:将集聚中的文档分组,可用以统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一样地理位置的不变文档。

实例

$project 实例

0 也无显示,1吗展示,默认情况下 _id 字段是 1

db.articles.aggregate({
    $project: {
        _id: 0,
        title: 1,
        by_user: 1,
    }
});

 // 返回
{ "title" : "MongoDB Overview", "by_user" : "runoob.com" }
{ "title" : "NoSQL Overview", "by_user" : "runoob.com" }
{ "title" : "Neo4j Overview", "by_user" : "Neo4j" }

$match 实例

$match
用于取分数大于70低于或当90笔录,然后将符合条件的笔录送及下一阶段$group管道操作符进行拍卖。

db.articles.aggregate([
    { $match: { score: { $gt: 70, $lte: 90 } } },
    { $group: { _id: null, count: { $sum: 1 } } }
]);

 // 返回
{ "_id" : null, "count" : 1 }

$skip 实例

透过 $skip 管道操作符处理后,前2独文档被”过滤”掉。

db.col_1.aggregate({ $skip: 2 });

MongoDB – 复制

MongoDB 复制(副本集)是==将数据并于差不多只服务器==的经过。

复制提供了数的冗余备份,并在多单服务器上囤积数据副本,提高了多少的可用性,
并可以保证数据的安全性。

特点:

  • 保障数据的安全性
  • 数据高可用性 (24*7)
  • 难恢复,复制允许你于硬件故障及劳务中断中平复数据。
  • 不要停机维护(如备份,重建索引,压缩)
  • 分布式读取数据

  • N 独节点的集群

  • 另节点可视作主节点

  • 不无写入操作都在主节点上
  • 机关故障转移
  • 机关恢复

复制原理

mongodb 的复制至少需要简单个节点。

  • 里一个凡是==主节点==,负责处理客户端请求,
  • 外的且是==从节点==,负责复制主节点上的数量。

mongodb各个节点常见的衬托法吗:一主一自、一兆多起。

主节点记录在其上的具有操作oplog,从节点定期轮询主节点取这些操作,然后针对团结的数量副本执行这些操作,从而确保从节点的数目及主节点一致。

图片 12

image

复制设置

  1. 闭馆着周转的MongoDB服务器。

如今我们经过点名 –replSet 选项来启动mongoDB

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

实例:

下实例会启动一个称也rs0之MongoDB实例,其端口号为27017。

起先后打开命令提示框并连续达mongoDB服务。

每当Mongo客户端使用命令rs.initiate()来启动一个新的可本集。

咱得以利用rs.conf()来查副本集的安排

翻副本集状态下 rs.status() 命令

mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0

副本集添加成员

增长可本集的成员,我们用运用多长长的服务器来启动mongo服务。

入Mongo客户端,并以rs.add()方法来上加合本集的分子。

rs.add(HOST_NAME:PORT)

实例:

假定你早已起步了一个号称吧 mongod1.net,端口号也27017之Mongo服务。

每当客户端命令窗口以rs.add() 命令将那个补充加到副本集中,命令如下所示:

rs.add("mongod1.net:27017")

MongoDB 中你只能通过主节点将Mongo服务添加到副本集中,
判断当前运行的Mongo服务是否为主节点可以使命令

db.isMaster()

MongoDB的称本集与我们广阔的基本有所不同,主从在主机宕机后拥有服务用停,而可本集在主机宕机后,副本会接管主节点变为主节点,不见面出现宕机的状态。

MongoDB – 分片

当MongoDB存储海量的数码常常,==一高机器可能不足以存储数据==,也可能不足以提供可承受的读写吞吐量。这时,我们便可以通过以差不多贵机械及划分数据,使得数据库系统能够储存和处理还多之数。

为何以分片?

  • 复制所有的写入操作及主节点
  • 缓的灵巧数据会在主节点查询
  • 单个副本集限制在12独节点
  • 当请求量巨大时会出现内存不足。
  • 地面磁盘不足
  • 直扩展价格昂贵

分片集群结构

图片 13

image

老三独关键组件:

  • Shard: 用于储存实际的数据块,实际生产条件受到一个shard
    server角色可由于几台机器组个一个replica set承担,防止主机单点故障
  • Config Server: mongod实例,存储了上上下下 ClusterMetadata,其中包
    chunk信息。
  • Query Routers:
    前端路由,客户端由此接入,且受整集群看上去像单一数据库,前端采用可透明使用。

MongoDB – 监控

监理可以了解 MongoDB 的==运行状况==及==性能==

MongoDB中提供了 mongostat 和 mongotop 两只命来监督MongoDB的运作状态。

mongostat

它们会距离固定时间得 mongodb 的眼前运行状态,并出口。

若是你发觉数据库突然变慢或者来其它题目吧,你一直的操作就考虑动用
mongostat 来查阅 mongo 的状态。

mongostat

图片 14

mongotop

mongotop用来跟MongoDB的实例,提供每个集合的统计数据。默认情况下,mongotop每一样秒刷新一差。

mongotop

图片 15

出口结果字段说明:

  • ns:包含数据库命名空间,后者结合了数据库名称和集合。
  • db:包含数据库的称。名吧 . 的数据库针对全局锁定,而休特定数据库。
  • total:mongod花费的时光工作在这命名空间提供总额。
  • read:提供了汪洋底年月,这mongod花费在实行读操作,在这个命名空间。
  • write:提供这命名空间拓展摹写操作,这mongod花了大气之辰。

候的时空长短,以秒为单位,默认 1s

mongotop 10

报每个数据库的锁之动

mongotop --locks

MongoDB – 备份与还原

mongodump

以Mongodb中我们采用 mongodump 命令来备份MongoDB数据。

拖欠令可以导出所有数据到指定目录中。

mongodump命令可以透过参数指定导出的多寡量级转存的服务器。

mongodump -h dbhost -d dbname -o dbdirectory

-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

实例

备份 mongodb_study 数据库被的富有集合到 E:\MongoDB\dump

mongodump -h 127.0.0.1 -d mongodb_study -o E:\MongoDB\dump

匪带来任何参数,即当当前目录下备份所有数据库实例

mongodump

备份所有MongoDB数据

mongodump --host HOST_NAME --port PORT_NUMBER

// 如
mongodump --host w3cschool.cc --port 27017

备份指定数据库的联谊

mongodump --collection COLLECTION_NAME --db DB_NAME

// 如
mongodump --collection mycol --db test

mongorestore

每当Mongodb中我们以 mongorestore 命令来还原MongoDB数据。

mongorestore -h <hostname><:port> -d dbname <path>

--host <:port>, -h <:port>:MongoDB所在服务器地址,默认为: localhost:27017
--db , -d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
<path>:mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。
--dir:指定备份的目录,你不能同时指定 <path> 和 --dir 选项。

实例

过来存放于 E:\MongoDB\dump 中之数据库
mongodb_study,恢复前后的数据库名不必相同

mongorestore -h localhost /db mongodb_study /dir E:\MongoDB\dump\mongodb_study

Node.js 连接 MongoDB

与 MySQL 不同的凡 MongoDB
会自动创建数据库及聚集,所以下前我们不需要手动去创造。

设置驱动:npm install mongodb

运行 node:node connect

实例

connect.js

const MongoClient = require('mongodb').MongoClient;

// 自动创建数据库 runoob
let mongoConnect = 'mongodb://localhost:27017/runoob';

// 插入数据,插入到数据库 runoob 的 site 集合中
let insertData = function(db, callback) {
    // 自动创建集合 site
    let collection = db.collection('site');
    // 插入文档
    let data = [{
        "name": "菜鸟教程",
        "url": "www.runoob.com"
    }, {
        "name": "菜鸟工具",
        "url": "c.runoob.com"
    }];

    collection.insert(data, function(err, result) {
        if (err) {
            console.log('Error:' + err);
            return;
        }
        callback(result);
    });
};

// 删除数据,删除所有 name 为 "菜鸟工具" 的文档
let deleteData = function(db, callback) {
    let collection = db.collection('site');
    let whereStr = {
        "name": "菜鸟工具"
    };

    collection.remove(whereStr, function(err, result) {
        if (err) {
            console.log('Error:' + err);
            return;
        }
        callback(result);
    });
};

// 修改数据,将所以 name 为 "菜鸟教程" 的 url 改为 https://www.runoob.com
let updateData = function(db, callback) {
    let collection = db.collection('site');
    let whereStr = {
        "name": "菜鸟教程"
    };
    let updateStr = {
        $set: {
            "url": "https://www.runoob.com"
        }
    };

    collection.update(whereStr, updateStr, {
        multi: true
    }, function(err, result) {
        if (err) {
            console.log('Error:' + err);
            return;
        }
        callback(result);
    });
};

// 查询数据,查询 name 为 "菜鸟教程" 的数据
let selectData = function(db, callback) {
    let collection = db.collection('site');
    let whereStr = {
        "name": '菜鸟教程'
    };

    collection.find(whereStr).toArray(function(err, result) {
        if (err) {
            console.log('Error:' + err);
            return;
        }
        callback(result);
    });
};

MongoClient.connect(mongoConnect, function(err, db) {
    console.log("连接成功!");

    insertData(db, function(result) {
        console.log("插入数据成功!");
        console.log(result);
        db.close();
    });

    deleteData(db, function(result) {
        console.log("删除数据成功!");
        console.log(result);
        db.close();
    });

    updateData(db, function(result) {
        console.log("修改数据成功!");
        console.log(result);
        db.close();
    });

    selectData(db, function(result) {
        console.log("查询数据成功!");
        console.log(result);
        db.close();
    });
});

mongoose

Mongoose学习参考文档——基础篇:https://cnodejs.org/topic/504b4924e2b84515770103dd

mongoose学习笔记:https://cnodejs.org/topic/58b911997872ea0864fee313

mongoose学习文档:http://www.cnblogs.com/y-yxh/p/5689555.html

Nodejs学习笔记(十四)—
Mongoose介绍与入门:http://www.cnblogs.com/zhongweiv/p/mongoose.html

Mongoose全面理解:http://www.cnblogs.com/jayruan/p/5123754.html

Node.js 有指向 MongoDB
的数据库让:mongodb。你可以应用 npm install mongodb 来安装。不过一直动用
mongodb 模块虽然强大使活,但小麻烦,我哪怕动用 mongoose 吧。

Mongoose 基于nodejs、构建以 mongodb 之上,使用 javascript 编程,是==连接
mongodb
数据库的软件包==,使mongodb的文档数据模型变的雅致起来,方便对mongodb文档型数据库的总是和增删改查等常规数量操作。

mongoose 是眼前采取 mean(mongodb express angularjs
nodejs)全栈开发必用的连续数据库软件包。

==mongoose ,提供了Schema、Model 同 Document 对象,用起更方便。==
另外,mongoose 还有 Query 和 Aggregate 对象:Query 实现查询、Aggregate
实现集

mongoose 三单重要概念

图片 16

Schema、Model、Entity
的干:Schema生成Model,Model创造Entity,Model和Entity都可针对数据库操作导致影响,但Model比Entity更拥有操作性。

1. Schema 模式

Schema 对象定义==文档结构==,可以定义字段、类型、唯一性、索引、验证等。

Schema
不仅定义了文档结构及使用性能,还可以生扩张插件、实例方法、静态方法、复合索引、文档生命周期钩子

// new mongoose.Schema() 中传入一个 JSON 对象,定义属性和属性类型
var BlogSchema = new mongoose.Schema({
    title: String,
    author: String
});

部分上,我们创建的 Schema 不仅要为后的 Model 和 Entity
提供公共的性,还要提供公共的章程。

2. Model 模型

Model 对象表示集合中的备文档

是因为 Schema 颁发变的范,具有抽象属性和行为的数据库操作对

3. Document 文档

Document 可等同于 Entity

由 Model 创建的实业,他的操作也会见影响数据库

使用

  1. 概念一个 Schema 模式
  2. 将该 Schema 发布为 Model
  3. 用 Model 创建 Entity
  4. Entity 是具有现实的数据库操作 CRUD 的

mongoose 的 connection 对象定义了片波,比如 connected open close
error 等,我们可监听这些事件。

const mongoose = require('mongoose');

let db = mongoose.connect('mongodb://127.0.0.1:27017/test');

db.connection.on('error', console.error.bind(console, '数据库连接失败:'));

db.connection.once('open', function() {
    console.log('数据库连接成功!');

    // 定义一个 Schema 模式
    // new Schema() 中传入一个 JSON 对象,定义属性和属性类型
    let PersonSchema = new mongoose.Schema({
        name: {
            type: String,
            unique: true
        },
        password: String
    });

    // 将该 Schema 发布为 Model
    let PersonModel = mongoose.model('col_1', PersonSchema);

    // 拿到了 Model 对象,就可以执行增删改查等操作了
    // 如果要执行查询,需要依赖 Model,当然 Entity 也是可以做到的
    PersonModel.find(function(err, result) {
        // 查询到的所有person
    });

    // 用 Model 创建 Entity
    let personEntity = new PersonModel({
        name: 'Krouky',
        password: '10086'
    });

    // Entity 是具有具体的数据库操作 CRUD 的
    // 执行完成后,数据库就有该数据了
    personEntity.save(function(err, result) {
        if (err) {
            console.log(err);
        } else {
            console.log(`${result} saved!`);
        }
    });
});

—title: mongoDB
学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与回复、监控等等)tags:
[mongoDB, mongoose, Node.js]—
末更新时间:2017-07-13 11:10:49
原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb\_primer/
# MongoDB – 简介
官网:https://www.mongodb.com/
MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB
应用提供可扩大的胜性能数据存储解决方案。
MongoDB
是一个在关系数据库和未关系数据库之间的制品,是非关系数据库当中作用最丰富,最像关系数据库的。
![image](http://www.runoob.com/wp-content/uploads/2013/10/mongodb-logo.png)
<!– more –>
# MongoDB – 安装与运行

  1. 下载
    07/05/2017 Current Stable Release (3.4.6)
    https://www.mongodb.com/download-center\#community
  2. 创数量目录
    MongoDB 将数据目录存储在 db 目录下,需手动创建。
    “`E:\MongoDB\data\db“`
  3. 运行 MongoDB 服务器
    以打命提示符下运行MongoDB服务器,你必须由`MongoDB\bin`目中履行`mongod.exe`文件,不要关服务。`ctrl
  4. c`关闭。
    “`mongod.exe –dbpath E:\MongoDB\data\db“`
  5. MongoDB 后台管理
    运行 mongo.exe
    MongoDB Shell是MongoDB自带的交互式Javascript
    shell,用来对MongoDB进行操作以及治本的交互式环境。
  6. 用 MongoDB 服务器作为 Windows 服务运作
    填补加系统环境 path `E:\MongoDB\Server\3.4\bin`
    检测:cmd 中输入 `mongod –help`
    新建文件:`E:\MongoDB\logs\logs.log`
    将 MongoDB 服务器作为 Windows 服务以 Windows 启动而打开:
    “`mongod.exe –logpath “E:\MongoDB\logs\logs.log” –logappend
    –dbpath “E:\MongoDB\data” –directoryperdb –serviceName MongoDB
    –install“`
    开启 MongoDB 服务:`net start MongoDB`
    停止 MongoDB 服务:`net stop MongoDB`
    删除 MongoDB 服务:`sc delete MongoDB`
    搭下便好在 cmd 中运作 `E:\MongoDB\Server\3.4\bin` 里面的
    `*.exe` 程序了
  7. shell 控制台 `mongo`- 数据库的还原 `mongorestore`- 备份
    `mongodump`
  8. mongodb 启动之参数
    ![](http://oph264zoo.bkt.clouddn.com/17-7-10/94205609.jpg)

# mongoDB – 主要特色

  • MongoDB安装简便。-
    MongoDB的供了一个面向文档存储,没有说明结构的定义,每天记下得起了两样之结构,操作起来比较简单和爱。-
    完全的目支持(单键索引、数组索引、全文索引、地理位置索引 等)-
    你可经地面或网络创建数量镜像,这让MongoDB有还胜似的扩展性。-
    如果负载的增加(需要还多的积存空间及还胜似之处理能力)
    ,它好分布在电脑网络中之别节点上立刻就算是所谓的分片。-
    Mongo支持添加的询问表达式。查询指令以JSON形式的符号,可随便查询文档中内嵌的目标及数组。-
    MongoDb
    使用update()命令可以兑现替换完成的文档(数据)或者部分指定的多少字段 。-
    Mongodb中的Map/reduce主要是用来对数据开展批量拍卖及集合操作。-
    Map以及Reduce。Map函数调用emit(key,value)遍历集合中负有的记录,将key与value传给Reduce函数进行拍卖。-
    Map函数和Reduce函数是下Javascript编写的,并得以经过db.runCommand或mapreduce命令来推行MapReduce操作。-
    GridFS是MongoDB中之一个搭功能,可以用于存放大量多少文件。-
    MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接以服务端执行,也可以管函数的定义存储于服务端,下次直调用即可。-
    MongoDB 支持多编程语言:C C++ C# .NET Erlang Haskell Java JavaScript
    Lisp node.JS Perl PHP Python Ruby Scala 等

# mongoDB – 工具
监控

  • Munin:网络及系统监控工具- Gangila:网络以及系统监控工具-
    Cacti:用于查看CPU负载, 网络带富利用率,它也供了一个使叫监控 MongoDB
    的插件。
    GUI
  • Robomongo(Robo 3T)- Fang of Mongo –
    网页式,由Django和jQuery所结合。- Futon4Mongo – 一个CouchDB Futon
    web的mongodb山寨版。- Mongo3 – Ruby写成。- MongoHub –
    适用于OSX的应用程序。- Opricot – 一个根据浏览器的MongoDB控制台,
    由PHP撰写而变成。- Database Master — Windows的mongodb管理工具- RockMongo —
    最好的PHP语言的MongoDB管理工具,轻量级, 支持多国语言.

# mongoDB – 三老主要概念
![](http://oph264zoo.bkt.clouddn.com/17-7-10/40361974.jpg)
## 1. database 数据库
基本上独聚众逻辑上组织以齐,就是数据库。

数据库命名规范:

  • 匪可知是空字符串(””)。- 不得含有’ ‘(空格)、.、$、/、\和\0
    (空字符)。- 应总体大写。- 最多64字节。
    出一对数据库名是保留的,可以一直看这些有特殊作用的数据库。
  • admin:
    从权力的角度来拘禁,这是”root”数据库。要是拿一个用户增长到这数据库,这个用户自行连续所有数据库的权杖。一些特定的劳动器端命令也只好由之数据库运行,比如列出所有的数据库或者关闭服务器。-
    local: 这个数据永远不见面被复制,可以据此来囤限于本地单台服务器的任性集合-
    config:
    当Mongo用于分片设置时,config数据库在内部以,用于保存分片的连锁消息。

## 2. collection 集合
大多只文档组成一个会合,相当给关系数据库的发明。
有存储在集合中之数都是 BSON 格式,BSON 是看似 JSON
的一致种二进制形式之囤格式,简称 Binary JSON。
集合名命名规范:

  • 集合名不克是空字符串””。-
    集合名不可知含有\0字符(空字符),这个字符表示集合名的结尾。-
    集合名不克因”system.”开头,这是吗系统集合保留的前缀。-
    用户创建的聚集名字不能够含有保留字符。有些驱动程序的确支持于集合名里面富含,这是坐一些系统生成的汇中寓该字符。除非您要是访问这种系统创造的聚众,否则千万不要以名字里出现$。 
    ![](http://oph264zoo.bkt.clouddn.com/17-7-10/85296048.jpg)
    ## 3. document 文档
    MongoDB 将数据存储吗一个文档,数据结构由键值对构成。
    MongoDB 文档是均等组键值对(即BSON,二进制的 JSON),类似于 JSON
    对象。字段值可以蕴涵其他文档,数组及文档数组。
    文档键命名规范:
  • 键不可知含有\0 (空字符)。这个字符用来表示键的终极。-
    .以及$有特别之含义,只有在一定条件下才能够使。-
    以下划线”_”开头的键是保留的(不是严格要求的)。
    亟需注意的是:
  • 文档中之键值对是一成不变的。-
    文档中的值不仅可以是以双引号里面的字符串,还得是另外几种多少列(甚至足以是成套嵌入的文档)。-
    MongoDB区分类型与尺寸写。- MongoDB的文档不可知发出再次的键。-
    文档的键是字符串。除了少数例外情况,键可以下任意UTF-8字符。

![image](http://www.runoob.com/wp-content/uploads/2013/10/Figure-1-Mapping-Table-to-Collection-1.png)
![image](http://www.runoob.com/wp-content/uploads/2013/10/crud-annotated-document.png)

# MongoDB – 数据类型
ObjectId:主键,一种植奇特而很主要之类别,每个文档都见面默认配置是特性,属性名也_id,除非自己定义,方可覆盖
![](http://oph264zoo.bkt.clouddn.com/17-7-10/40659707.jpg)

# MongoDB – 常见操作
## 查看时数据库
“`db“`
## 查看有数据库
不曾数据的数据库不予显示
MongoDB 中默认的数据库也 test,如果您无开创新的数据库,集合将存放于
test 数据库中。
“`show dbs“`
## 连接到指定的数据库
倘若数据库不存,则创造数据库,否则切换到指定数据库。
“`use db_name“`
## 查看服务器状态
“`db.serverStatus()“`

## 查看数据库统计信息
“`db.stats()“`

## 删除数据库
“`db.dropDatabase()“`
## 查看数据库中保有集合
“`show tables或show collections“`
## 清空集合
抹里面的文档,但凑还以
“`db.col_name.remove({})“`

去集合
“`db.col_name.drop()“`
查集合详细信息
MongoDB 的3.0继底本子分了三种模式
queryPlanner、executionStats、allPlansExecution
“`db.col_name.find({key:value}).explain(“allPlansExecution”)“`
# MongoDB – 增删改查
## 插入
MongoDB 用 insert() 或 save() 方法为集中插入文档:
而该集不以拖欠数据库中, MongoDB 会自动创建该集合并插入文档。
insert() 或 save() 方法还可以向collection里安插入数据,两者分别:-
如果不负定 _id 字段,**save() 方法**恍如于 insert() 方法。如果指定
_id 字段,则会更新该 _id 的数目。-
使用save函数,如果原先的对象非设有,那他们还好于collection里插入数据,如果已在,save会调用update更新中的记录,而insert则会忽略操作-
insert可以一次性插入一个列表,而休用遍历,效率高,
save则需遍历列表,一个个栽。
“`db.col_name.insert(document)
db.col_name.save(document)“`
插入一个文档到 col 集合中:
“`db.col_1.insert({    title: ‘MongoDB 教程’,    description:
‘MongoDB 是一个 Nosql 数据库’,    by: ‘菜鸟教程’,    url:
‘http://www.runoob.com’,    tags: [‘mongodb’, ‘database’, ‘NoSQL’],   
likes: 100})“`
啊堪以文档数据定义为一个变量,如下所示:
“`document = ({    title: ‘MongoDB 教程’,    description: ‘MongoDB
是一个 Nosql 数据库’,    by: ‘菜鸟教程’,    url:
‘http://www.runoob.com’,    tags: [‘mongodb’, ‘database’, ‘NoSQL’],   
likes: 100});
db.col_2.insert(document)“`

## 删除
remove() 函数是用来删除集合中之数据
在实行 remove() 函数前先行实施 find()
命令来判断执行的标准化是否科学,这是一个于好的习惯。
“`db.col_name.remove(   <query>,   {     justOne:
<boolean>,     writeConcern: <document>   })

  • query :(可选)删除的文档的标准。- justOne : (可选)如果要是为 true 或
    1,则只有去一个文档。- writeConcern :(可选)抛来怪的级别。“`
    删除集合中装有文档
    “`db.col.remove({})“`
    移除 col_1 集合中 title 为 MongoDB save
    的文档,只去第一漫长找到的笔录
    “`db.col_1.remove({‘title’:’MongoDB save’}, 1)“`

## 更新
MongoDB 以 update() 和 save() 方法来更新集合中的文档
**update() 方法**用以创新都是的文档
“`db.col_name.update(   <query>,   <update>,   {   
 upsert: <boolean>,     multi: <boolean>,     writeConcern:
<document>   })

  • query : update 的询问条件,类似sql update查询内where后面的。- update :
    update的目标和有些翻新的操作符(如$,$inc…)等,也得领略啊sql
    update查询内set后面的- upsert : 可摘,这个参数的意是,如果非存在
    update 的记录,是否插入记录,true 为插入,默认是 false,不栽。- multi
    : 可选,mongodb
    默认是false,只更新找到的首先条记下,如果此参数为true,就拿准原则查下多长达记下整个更新。-
    writeConcern :可选,抛来深的级别。“`
    透过 update() 方法来更新 col_1 集合中的 title
    $set 操作符为部分更新操作符,只更新 $set
    之后的数码,而未是埋前的数额
    “`db.col_1.update({ ‘title’: ‘MongoDB 教程’ }, { $set: { ‘title’:
    ‘MongoDB’ } })“`
    以上语句只见面改第一长长的发现的文档,如果只要改多长条相同之文档,则需要安装
    multi 参数为 true。
    “`db.col_1.update({ ‘title’: ‘MongoDB 教程’ }, { $set: { ‘title’:
    ‘MongoDB’ } }, { multi: true })“`
    **save() 方法**由此传播的文档来替换已发出文档。语法格式如下:
    “`db.col_name.save(   <document>,   {     writeConcern:
    <document>   })“`
    以下实例中我们轮换了 col_1 的文档数据:
    “`document = ({    “_id”: “1”,    “title”: “MongoDB save”,   
    “description”: “MongoDB 是一个 Nosql 数据库”,    “by”: “菜鸟”,    “url”:
    “http://www.runoob.com”,    “tags”: [“mongodb”, “database”,
    “NoSQL”],});
    db.col_1.save(document)“`

## 查询
find() 方法,它回到集合中有着文档。
findOne() 方法,它只是回去一个文档。
“`db.col_name.find(query, projection)

  • query :可选,使用查询操作符指定询问条件- projection
    :可选,使用投影操作符指定返回的键。查询时回来文档中保有键值,
    只需要省略该参数即可(默认省不怎么)。“`
    格式化输出:
    “`db.col_name.find().pretty()“`
    翻开集合中文档的个数:
    “`db.col_name.find().count()“`
    跳过指定数量之数目:
    “`db.col_name.find().skip()“`

读取指定记录之条数:
“`db.col_name.find().limit()“`

排序:
sort()方法可以由此参数指定排序的字段,并运用 1 和 -1
来指定排序的措施,其中 1 为升序排列,而-1凡是用于降序排列。
“`db.col_name.find().sort({key:1})“`

sort()方法可由此参数指定排序的字段,并下 1 和 -1
来指定排序的法子,其中 1 为升序排列,而-1是用于降序排列。
### Where 语句
如若你想取得”col”集合中 “likes” 大于100,小于 200
的数目,你得下以下命令:
“`db.col.find({likes : {$lt :200, $gt : 100}})
// 类似于SQL语句:Select * from col where likes>100 AND
 likes<200;“`
标准操作符 | 中文 | 全英文—|—|—$gt | 大于 | greater than$gte |
大于等于 | greater than equal$lt | 小于 | less than$lte | 小于等于 |
less than equal$ne | 不顶 | not equal
![](http://oph264zoo.bkt.clouddn.com/17-7-10/77341320.jpg)

### $type 操作符
于是来寻觅集合中匹配的数据类型
![](http://oph264zoo.bkt.clouddn.com/17-7-10/64789398.jpg)
比方想博得 “col” 集合中 title 为 String 的数码,你得用以下命令:
“`db.col.find({“title” : {$type : 2}})“`

### AND 条件
find() 方法好流传多独键(key),每个键(key)以逗号隔开,语法格式如下:
“`db.col_name.find({key1:value1, key2:value2}).pretty()
// 类似于 SQL and 语句:SELECT * FROM col_name WHERE key1=’value1′ AND
key2=value2“`
### OR 条件
“`db.col_name.find({ $or: [{ “by”: “菜鸟教程” }, { “title”:
“MongoDB 教程” }] }).pretty()
// 类似于 SQL or 语句:SELECT * FROM col_name WHERE key1=value1 OR
key2=value2“`
### AND 和 OR 联合利用
“`db.col_name.find({    “likes”: {        $gt: 50    },    $or:
[{        “by”: “菜鸟教程”    }, {        “title”: “MongoDB 教程”   
}]}).pretty()
// 类似常规 SQL 语句:SELECT * FROM col_name where likes>50 AND (by
= ‘菜鸟教程’ OR title = ‘MongoDB 教程’)“`

# MongoDB – 索引
> [瞩目:从 mongoDB 3.0 开始,ensureIndex 被丢,今后还单是
createIndex
的一个号。](http://docs.mongoing.com/manual-zh/reference/method/db.collection.ensureIndex.html)
目通常会大幅度的==提高查询的频率==,如果无索引,MongoDB在读取数据时必扫描集合中的每个文件并选择那些符合查询条件的笔录。
这种扫描都集合的查询效率是老小之,特别以拍卖大量的数量经常,查询好要花几十秒甚至几分钟,这对准网站的特性是大沉重之。
目是不同寻常之数据结构,索引存储在一个爱遍历读取的数据集合中,索引是对准数据库表中相同列或多排的价值进行排序的同等种结构
## 索引常用命令
getIndexes 查看集合索引情况
“`db.col_name.getIndexes()“`
hint 强制行使索引

“`db.col_name.find({age:{$lt:30}}).hint({name:1,
age:1}).explain()“`
抹索引(不会见去除 _id 索引)
“`db.col_name.dropIndexes()
db.col_name.dropIndex({firstname: 1})“`

## createIndex() 方法
MongoDB使用 createIndex() 方法来创造索引
key 为卿如果开创的索引字段,1呢按照升序创建索引,-1吧遵循降序创建索引。
也得以装使用多单字段创建索引(关系项目数据库中称作复合索引)
“`db.col_name.createIndex({key:1})“`
createIndex() 接收可摘参数,可摘参数列表如下:
![](http://oph264zoo.bkt.clouddn.com/17-7-10/15192561.jpg)
### _id 索引
对于每个插入的数,都见面自动生成一长条唯一的 _id 字段,_id
索引是绝大多数汇默认建立的目录
“`> db.col_1.insert({x:10})WriteResult({ “nInserted” : 1 })
> db.col_1.find(){ “_id” : ObjectId(“59658e56aaf42d1c98dd95a2”),
“x” : 10 }
> db.col_1.getIndexes()[        {                “v” : 2,         
      “key” : {                        “_id” : 1                },     
          “name” : “_id_”,                “ns” : “runoob.col_1”     
  }]
“`
字段解释:

  • v 代表 version,在 Mongo3.2 之前的版本被,会有
    {v:0}(版本锁为0)的景况。在3.2随后的本被,{v:0}
    不再允许下,这一部分足免错过关爱,因为 v 由系统活动管理
  • key 表示作为目录的键。1 要 -1表示排序模式,1乎升序,1乎降序
  • name
    代表索引的名字,默认生成名称的平整是作`目的字段_排序模式`
  • ns 表示 namespace 命名空间,由`数据库名称.集合名称`组成

### 单键索引
极致家常的目,不会见自动创建
“`// 对 x 字段创建升序索引
> db.col_1.createIndex({x:1}){       
“createdCollectionAutomatically” : false,        “numIndexesBefore” :
1,        “numIndexesAfter” : 2,        “ok” : 1}
> db.col_1.find(){ “_id” : ObjectId(“59658e56aaf42d1c98dd95a2”),
“x” : 10 }
> db.col_1.getIndexes()[        {                “v” : 2,         
      “key” : {                        “_id” : 1                },     
          “name” : “_id_”,                “ns” : “runoob.col_1”     
  },        {                “v” : 2,                “key” : {         
              “x” : 1                },                “name” : “x_1”, 
              “ns” : “runoob.col_1”        }]
“`

### 多键索引
单键索引的价值吗一个纯净的价,多键索引的价有差不多只数据(如数组)
而mongoDB中插数组类型的多键数据,索引是**电动建立**的,无需刻意指定
“`> db.col_1.insert({z:[1,2,3,4,5]})WriteResult({ “nInserted”
: 1 })
> db.col_1.find(){ “_id” : ObjectId(“59658e56aaf42d1c98dd95a2”),
“x” : 10 }{ “_id” : ObjectId(“5965923eaaf42d1c98dd95a3”), “y” : 20 }{
“_id” : ObjectId(“59659828aaf42d1c98dd95a4”), “z” : [ 1, 2, 3, 4, 5 ]
}
> db.col_1.find({z:3}){ “_id” :
ObjectId(“59659828aaf42d1c98dd95a4”), “z” : [ 1, 2, 3, 4, 5 ]
}“`

### 复合索引
同时针对多独字段创建索引

“`> db.col_2.insert({x:10,y:20,z:30})WriteResult({ “nInserted” :
1 })
> db.col_2.find(){ “_id” : ObjectId(“59659a57aaf42d1c98dd95a5”),
“x” : 10, “y” : 20, “z” : 30 }
> db.col_2.createIndex({x:1,y:1}){       
“createdCollectionAutomatically” : false,        “numIndexesBefore” :
1,        “numIndexesAfter” : 2,        “ok” : 1}
> db.col_2.getIndexes()[        {                “v” : 2,         
      “key” : {                        “_id” : 1                },     
          “name” : “_id_”,                “ns” : “runoob.col_2”     
  },        {                “v” : 2,                “key” : {         
              “x” : 1,                        “y” : 1                }, 
              “name” : “x_1_y_1”,                “ns” :
“runoob.col_2”        }]“`

### 过期索引
又如 TTL(Time To
Live,生存时间)索引,即当一段时间后会见晚点的目(如登录信息、日志等)
逾期后的索引会连同文档一起去
expireAfterSeconds:指定一个因秒为单位之数值,设定集合的生存时间。
只顾:- 存储在过期索引字段的价值必须是指定的辰档次(必须是 ISODate 或
ISODate 数组,不可知以时穿,否则不能够为自动删除)- 如果指定了 ISODate
数组,则随最小之工夫进行删除-
过期索引不克是复合索引(不克指定两单过时)- 删除时在小误差(1
分钟左右)
“`> db.col_3.insert({x:new Date()})WriteResult({ “nInserted” : 1
})
> db.col_3.find(){ “_id” : ObjectId(“59659f3baaf42d1c98dd95a7”),
“x” : ISODate(“2017-07-12T04:02:03.835Z”) }
> db.col_3.createIndex({x:1},{expireAfterSeconds:10}){       
“createdCollectionAutomatically” : false,        “numIndexesBefore” :
1,        “numIndexesAfter” : 2,        “ok” : 1}
> db.col_3.getIndexes()[        {                “v” : 2,         
      “key” : {                        “_id” : 1                },     
          “name” : “_id_”,                “ns” : “runoob.col_3”     
  },        {                “v” : 2,                “key” : {         
              “x” : 1                },                “name” : “x_1”, 
              “ns” : “runoob.col_3”,               
“expireAfterSeconds” : 10        }]
> db.col_3.find()// 无返回“`

### 全文索引
气象:全网站关键词搜索
key-value 中,key 此时为 `$**`(也可以是现实性某个 key),value
这呢一个稳的字符串(如 `text`)
全文索引相似度,与 sort 函数一起用力量又好
“`db.col_7.find({ $text: { $search: “aa bb” } }, { score: { $meta:
“textScore” } }).sort({ score: { $meta: “textScore” } })“`

只顾:- 每个集合只能创造一个全文索引- MongoDB 从 2.4
版本开始支持全文检索,从 3.2 版本开始支持中文-
(好像)只能对周单词查询,不能够针对单词的截取部分查询-
关键词里的空格表示`或`- 关键词之前的 – 表示`非`-
关键词加引号表示`与` (需用 \ 转义)

“`> db.col_7.find(){ “_id” :
ObjectId(“5965aa84aaf42d1c98dd95b0”), “title” : “aa bb cc”, “author” :
“白小明”, “article” : “这是白小明的同一篇文章,标题《aa bb cc》” }{ “_id”
: ObjectId(“5965aa8faaf42d1c98dd95b1”), “title” : “abc def”, “author” :
“白小明”, “article” : “这是白小明的平首稿子,标题《aa bb cc》” }{ “_id”
: ObjectId(“5965aedfaaf42d1c98dd95b2”), “title” : “aa bb”, “author” :
“白小明”, “article” : “这是白小明的同一篇文章,标题《aa bb cc》” }
> db.col_7.createIndex({“title”: “text”})
> db.col_7.find({$text:{$search:”aa”}}){ “_id” :
ObjectId(“5965aa84aaf42d1c98dd95b0”), “title” : “aa bb cc”, “author” :
“白小明”, “article” : “这是白小明的平首文章,标题《aa bb cc》” }{ “_id”
: ObjectId(“5965aedfaaf42d1c98dd95b2”), “title” : “aa bb”, “author” :
“白小明”, “article” : “这是白小明的同一篇稿子,标题《aa bb cc》” }
> db.col_7.find({$text:{$search:”aa cc”}}){ “_id” :
ObjectId(“5965aa84aaf42d1c98dd95b0”), “title” : “aa bb cc”, “author” :
“白小明”, “article” : “这是白小明的平等首文章,标题《aa bb cc》” }{ “_id”
: ObjectId(“5965aedfaaf42d1c98dd95b2”), “title” : “aa bb”, “author” :
“白小明”, “article” : “这是白小明的一样首文章,标题《aa bb cc》” }
> db.col_7.find({$text:{$search:”\”aa\” \”cc\””}}){ “_id” :
ObjectId(“5965aa84aaf42d1c98dd95b0”), “title” : “aa bb cc”, “author” :
“白小明”, “article” : “这是白小明的平首稿子,标题《aa bb cc》” }
> db.col_7.find({$text:{$search:”aa
bb”}},{score:{$meta:”textScore”}}).sort({score:{$meta:”textScore”}}){
“_id” : ObjectId(“5965aedfaaf42d1c98dd95b2”), “title” : “aa bb”,
“author” : “白小明”, “article” : “这是白小明的同一首文章,标题《aa bb
cc》”, “score” : 1.5 }{ “_id” : ObjectId(“5965aa84aaf42d1c98dd95b0”),
“title” : “aa bb cc”, “author” : “白小明”, “article” :
“这是白小明的一模一样首文章,标题《aa bb cc》”, “score” : 1.3333333333333333
}

> db.col_7.dropIndexes()
> db.col_7.createIndex({“author”: “text”}))
> db.col_7.find({$text:{$search:”小明”}})})>
> db.col_7.find({$text:{$search:”白小明”}}){ “_id” :
ObjectId(“5965aa84aaf42d1c98dd95b0”), “title” : “aa bb cc”, “author” :
“白小明”, “article” : “这是白小明的一律篇稿子,标题《aa bb cc》” }{ “_id”
: ObjectId(“5965aa8faaf42d1c98dd95b1”), “title” : “abc def”, “author” :
“白小明”, “article” : “这是白小明的如出一辙首文章,标题《aa bb cc》” }{ “_id”
: ObjectId(“5965aedfaaf42d1c98dd95b2”), “title” : “aa bb”, “author” :
“白小明”, “article” : “这是白小明的一律篇稿子,标题《aa bb cc》” }“`

### 地理位置索引
翻看最近底点

# MongoDB – 聚合
==分组计算==
MongoDB
中会师主要用以拍卖数量(如平均值,求与齐),并返计算后的数额结果。类似sql语句被的
count(*)。

## aggregate() 方法
“`db.col_name.aggregate(AGGREGATE_OPERATION)“`
下表展示了有些凑合的表达式:
![](http://oph264zoo.bkt.clouddn.com/17-7-11/63467675.jpg)

### 实例

**计每个作者所描绘的章数**
当底下的例证中,我们由此字段by_user字段对数码进行分组,并盘算by_user字段相同值的总额。
聚中的数据如下:
“`{        “_id” : ObjectId(“5963b992a812aa05b9d2e765”),       
“title” : “MongoDB Overview”,        “description” : “MongoDB is no sql
database”,        “by_user” : “runoob.com”,        “url” :
“http://www.runoob.com”,        “tags” : [                “mongodb”,   
            “database”,                “NoSQL”        ],        “likes”
: 100}{        “_id” : ObjectId(“5963b9aaa812aa05b9d2e766”),       
“title” : “NoSQL Overview”,        “description” : “No sql database is
very fast”,        “by_user” : “runoob.com”,        “url” :
“http://www.runoob.com”,        “tags” : [                “mongodb”,   
            “database”,                “NoSQL”        ],        “likes”
: 10}{        “_id” : ObjectId(“5963b9bba812aa05b9d2e767”),       
“title” : “Neo4j Overview”,        “description” : “Neo4j is no sql
database”,        “by_user” : “Neo4j”,        “url” :
“http://www.neo4j.com”,        “tags” : [                “neo4j”,     
          “database”,                “NoSQL”        ],        “likes” :
750}“`
以aggregate()计算结果如下:
“`db.col_1.aggregate([{    $group: {        _id: “$by_user”,   
    num_tutorial: {            $sum: 1        }    }}])
// 返回{ “_id” : “Neo4j”, “num_tutorial” : 1 }{ “_id” : “runoob.com”,
“num_tutorial” : 2 }
// 以上实例类似sql语句select by_user, count(*) from col_1 group by
by_user“`

## 聚合管道
管道在Unix和Linux中貌似用于将手上令的出口结果作为下一个指令的参数。
MongoDB
的成团管道用MongoDB文档在一个管道处理完毕后用结果传递给下一个管道处理。管道操作是可更的。
表达式:处理输入文档并出口。表达式是无状态的,只能用来计算时集管道的文档,不可知处理任何的文档。

聚集管道常用之几乎独操作:

$project:修改输入文档的构造。可以据此来再命名、增加或者删除域,也得以用来创造计算结果和嵌套文档。-
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的专业查询操作。-
$limit:用来界定MongoDB聚合管道返回的文档数。-
$skip:在集合管道遭超越了指定数量之文档,并返余下的文档。-
$unwind:将文档中之有一个数组类型字段拆分成多漫长,每条包含数组中之一个值。-
$group:将集中的文档分组,可用于统计结果。-
$sort:将输入文档排序后输出。-
$geoNear:输出接近某一样地理位置的有序文档。

### 实例

**$project 实例**
0 为非亮,1啊展示,默认情况下 _id 字段是 1
“`db.articles.aggregate({    $project: {        _id: 0,       
title: 1,        by_user: 1,    }});
 // 返回{ “title” : “MongoDB Overview”, “by_user” : “runoob.com” }{
“title” : “NoSQL Overview”, “by_user” : “runoob.com” }{ “title” :
“Neo4j Overview”, “by_user” : “Neo4j” }“`
**$match 实例**
$match
用于取分数大于70低于或当90记下,然后将符合条件的笔录送及下一阶段$group管道操作符进行拍卖。
“`db.articles.aggregate([    { $match: { score: { $gt: 70, $lte: 90
} } },    { $group: { _id: null, count: { $sum: 1 } } }]);
 // 返回{ “_id” : null, “count” : 1 }“`
**$skip 实例**
经 $skip 管道操作符处理后,前2独文档被”过滤”掉。

“`db.col_1.aggregate({ $skip: 2 });“`

# MongoDB – 复制
MongoDB 复制(副本集)是==将数据并在差不多个服务器==的历程。
复制提供了数的冗余备份,并当多独服务器上囤积数据副本,提高了多少的可用性,
并可以保证数据的安全性。
特点:- 保障数据的安全性- 数据高可用性 (24*7)-
灾难恢复,复制允许而从硬件故障与服务中断中平复数据。-
无需停机维护(如备份,重建索引,压缩)- 分布式读取数据

  • N 个节点的集群- 任何节点可作为主节点- 所有写入操作都于主节点上-
    自动故障转移- 自动恢复
    ## 复制原理
    mongodb 的复制至少需要简单只节点。-
    其中一个凡==主节点==,负责处理客户端请求,-
    其余的且是==从节点==,负责复制主节点上之数。
    mongodb各个节点常见的烘托法啊:一兆一起、一预示多从。
    主节点记录在该及之有操作oplog,从节点定期轮询主节点获取这些操作,然后对好的数目副本执行这些操作,从而确保从节点的数码和主节点一致。
    ![image](http://www.runoob.com/wp-content/uploads/2013/12/replication.png)

## 复制设置

  1. 关门着运行的MongoDB服务器。
    兹咱们由此点名 –replSet 选项来启动mongoDB
    “`mongod –port “PORT” –dbpath “YOUR_DB_DATA_PATH” –replSet
    “REPLICA_SET_INSTANCE_NAME”“`
    实例:
    下面实例会启动一个称呼也rs0的MongoDB实例,其端口号为27017。
    起先后打开命令提示框并连续达mongoDB服务。
    在Mongo客户端使用命令rs.initiate()来启动一个初的契合本集。
    咱们得使用rs.conf()来查看副本集的配置
    查副本集状态下 rs.status() 命令
    “`mongod –port 27017 –dbpath “D:\set up\mongodb\data” –replSet
    rs0“`
    ## 副本集添加成员
    添加副本集的积极分子,我们用以多修服务器来启动mongo服务。
    上Mongo客户端,并使用rs.add()方法来填补加合本集的成员。
    “`rs.add(HOST_NAME:PORT)“`
    实例:
    如若你都启动了一个叫吧 mongod1.net,端口号为27017之Mongo服务。
    于客户端命令窗口以rs.add() 命令将该补充加到副本集中,命令如下所示:

“`rs.add(“mongod1.net:27017”)“`
MongoDB 中你只能通过主节点将Mongo服务添加到副本集中,
判断当前运行的Mongo服务是否为主节点可以使命令
“`db.isMaster()“`
MongoDB的符本集与我们广阔的核心有所不同,主从在主机宕机后有着服务将停,而可本集在主机宕机后,副本会接管主节点变成主节点,不见面并发宕机的场面。

# MongoDB – 分片
当MongoDB存储海量的数量时,==一玉机械可能不足以存储数据==,也恐怕不足以提供可承受的读写吞吐量。这时,我们尽管得透过在多令机器上分数据,使得数据库系统会储存和拍卖又多的数据。
干什么用分片?- 复制所有的写入操作及主节点-
延迟的精灵数据会在主节点查询- 单个副本集限制以12单节点-
当请求量巨大时见面产出内存不足。- 本地磁盘不足- 垂直扩展价格昂贵
## 分片集群结构
![image](http://www.runoob.com/wp-content/uploads/2013/12/sharding.png)
老三独第一组件:- Shard: 用于储存实际的数据块,实际生育环境面临一个shard
server角色可由几尊机械组个一个replica set承担,防止主机单点故障- Config
Server: mongod实例,存储了整套 ClusterMetadata,其中包 chunk信息。-
Query Routers:
前端路由,客户端由此接入,且让漫天集群看上去像单一数据库,前端采用得透明使用。

# MongoDB – 监控
监理可以了解 MongoDB 的==运行状况==及==性能==
MongoDB中提供了 mongostat 和 mongotop
两个指令来监督MongoDB的运转状况。
## mongostat
她会距离固定时间得 mongodb 的目前运作状态,并出口。
假定您发觉数据库突然变慢或者有另题目吧,你直接的操作就考虑用
mongostat 来查 mongo 的状态。
“`mongostat“`

![](http://oph264zoo.bkt.clouddn.com/17-7-11/60555691.jpg)
## mongotop
mongotop用来跟MongoDB的实例,提供每个集合的统计数据。默认情况下,mongotop每一样秒刷新一差。
“`mongotop“`
![](http://oph264zoo.bkt.clouddn.com/17-7-11/69555241.jpg)
出口结果字段说明:-
ns:包含数据库命名空间,后者结合了数据库名称以及聚集。-
db:包含数据库的名称。名吧 . 的数据库针对全局锁定,而无特定数据库。-
total:mongod花费的流年工作在是命名空间供总额。-
read:提供了大气之岁月,这mongod花费在推行读操作,在此命名空间。-
write:提供这命名空间拓展摹写操作,这mongod花了汪洋底时空。

待的时间长,以秒为单位,默认 1s
“`mongotop 10“`

报每个数据库的**锁**的使用
“`mongotop –locks“`

# MongoDB – 备份与还原
## mongodump
每当Mongodb中我们运用 `mongodump` 命令来备份MongoDB数据。
欠令可以导出所有数据到指定目录中。
mongodump命令可以由此参数指定导出的多寡量级转存的服务器。

“`mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所当服务器地址,例如:127.0.0.1,当然为可指定端口号:127.0.0.1:27017-d:需要备份的数据库实例,例如:test-o:备份的多少存放位置,例如:c:\data\dump,当然该目录需要提前立,在备份完成后,系统活动在dump目录下成立一个test目录,这个目录里存放该数据库实例的备份数据。“`
### 实例
备份 mongodb_study 数据库被的富有集合到 E:\MongoDB\dump
“`mongodump -h 127.0.0.1 -d mongodb_study -o
E:\MongoDB\dump“`

莫带其他参数,即当当前目录下备份所有数据库实例
“`mongodump“`
备份所有MongoDB数据
“`mongodump –host HOST_NAME –port PORT_NUMBER
// 如mongodump –host w3cschool.cc –port 27017“`
备份指定数据库的集
“`mongodump –collection COLLECTION_NAME –db DB_NAME
// 如mongodump –collection mycol –db test“`
## mongorestore
以Mongodb中我们利用 `mongorestore` 命令来过来MongoDB数据。
“`mongorestore -h <hostname><:port> -d dbname
<path>
–host <:port>, -h <:port>:MongoDB所于服务器地址,默认为:
localhost:27017–db , -d
:需要还原的数据库实例,例如:test,当然是称呼也可跟备份时候的非等同,比如test2–drop:恢复的时光,先去时数量,然后还原备份的多寡。就是说,恢复后,备份后补偿加修改的数量还见面被删,慎用哦!<path>:mongorestore
最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你免能够同时指定
<path> 和 –dir
选项,–dir也可装备份目录。–dir:指定备份的目录,你无能够而且指定
<path> 和 –dir 选项。“`
### 实例
卷土重来存放于 E:\MongoDB\dump 中之数据库
mongodb_study,恢复前后的数据库名不必相同
“`mongorestore -h localhost /db mongodb_study /dir
E:\MongoDB\dump\mongodb_study“`

# Node.js 连接 MongoDB
暨 MySQL 不同的凡 MongoDB
会自动创建数据库暨集纳,所以利用前我们无需要手动去创造。
安装驱动:`npm install mongodb`
运行 node:`node connect`

## 实例
connect.js
“`jsconst MongoClient = require(‘mongodb’).MongoClient;
// 自动创建数据库 runooblet mongoConnect =
‘mongodb://localhost:27017/runoob’;
// 插入数据,插入到数据库 runoob 的 site 集合中let insertData =
function(db, callback) {    // 自动创建集合 site    let collection =
db.collection(‘site’);    // 插入文档    let data = [{        “name”:
“菜鸟教程”,        “url”: “www.runoob.com”    }, {        “name”:
“菜鸟工具”,        “url”: “c.runoob.com”    }];
    collection.insert(data, function(err, result) {        if (err) {   
        console.log(‘Error:’ + err);            return;        }       
callback(result);    });};
// 删除数据,删除所有 name 为 “菜鸟工具” 的文档let deleteData =
function(db, callback) {    let collection = db.collection(‘site’);   
let whereStr = {        “name”: “菜鸟工具”    };
    collection.remove(whereStr, function(err, result) {        if (err)
{            console.log(‘Error:’ + err);            return;        }   
    callback(result);    });};
// 修改数据,将因此 name 为 “菜鸟教程” 的 url 改也
https://www.runoob.comlet updateData = function(db, callback) {    let
collection = db.collection(‘site’);    let whereStr = {        “name”:
“菜鸟教程”    };    let updateStr = {        $set: {            “url”:
“https://www.runoob.com”        }    };
    collection.update(whereStr, updateStr, {        multi: true    },
function(err, result) {        if (err) {           
console.log(‘Error:’ + err);            return;        }       
callback(result);    });};
// 查询数据,查询 name 为 “菜鸟教程” 的数let selectData = function(db,
callback) {    let collection = db.collection(‘site’);    let whereStr =
{        “name”: ‘菜鸟教程’    };
    collection.find(whereStr).toArray(function(err, result) {        if
(err) {            console.log(‘Error:’ + err);            return;     
  }        callback(result);    });};
MongoClient.connect(mongoConnect, function(err, db) {   
console.log(“连接成功!”);
    insertData(db, function(result) {       
console.log(“插入数据成功!”);        console.log(result);       
db.close();    });
    deleteData(db, function(result) {       
console.log(“删除数据成功!”);        console.log(result);       
db.close();    });
    updateData(db, function(result) {       
console.log(“修改数据成功!”);        console.log(result);       
db.close();    });
    selectData(db, function(result) {       
console.log(“查询数据成功!”);        console.log(result);       
db.close();    });});
“`

# mongoose
>
Mongoose学习参考文档——基础篇:https://cnodejs.org/topic/504b4924e2b84515770103dd
>
mongoose学习笔记:https://cnodejs.org/topic/58b911997872ea0864fee313
> mongoose学习文档:http://www.cnblogs.com/y-yxh/p/5689555.html
> Nodejs学习笔记(十四)—
Mongoose介绍与入门:http://www.cnblogs.com/zhongweiv/p/mongoose.html
> Mongoose全面掌握:http://www.cnblogs.com/jayruan/p/5123754.html
Node.js 有针对 MongoDB 的数据库让:mongodb。你得应用 `npm install
mongodb` 来安装。不过一直使用 mongodb
模块虽然强大使活,但小麻烦,我便动用 mongoose 吧。
Mongoose 基于nodejs、构建以 mongodb 之上,使用 javascript 编程,是==连接
mongodb
数据库的软件包==,使mongodb的文档数据模型变的幽雅起来,方便对mongodb文档型数据库的连和增删改查等正常数量操作。
mongoose 是时下应用 mean(mongodb express angularjs
nodejs)全栈开发必用的连年数据库软件包。
==mongoose ,提供了Schema、Model 和 Document 对象,用起更有利。==
另外,mongoose 还有 Query 和 Aggregate 对象:Query 实现查询、Aggregate
实现集

## mongoose 三单至关重要概念
![](http://oph264zoo.bkt.clouddn.com/17-7-9/52761494.jpg)
Schema、Model、Entity
的干:Schema生成Model,Model创造Entity,Model和Entity都只是针对数据库操作导致影响,但Model比Entity更富有操作性。
### 1. Schema 模式
Schema
对象定义==文档结构==,可以定义字段、类型、唯一性、索引、验证等。
Schema
不仅定义了文档结构及使用性能,还可发扩张插件、实例方法、静态方法、复合索引、文档生命周期钩子
“`// new mongoose.Schema() 中传入一个 JSON
对象,定义属性与总体性类型var BlogSchema = new mongoose.Schema({    title:
String,    author: String});
“`
一对时候,我们创建的 Schema 不仅使啊后面的 Model 和 Entity
提供公共的性能,还要提供公共的方式。

### 2. Model 模型
Model 对象表示集合中的备文档
鉴于 Schema 宣告变的模型,具有抽象属性与表现之数据库操作对
### 3. Document 文档
Document 可等同于 Entity
由于 Model 创建的实业,他的操作为会见影响数据库

## 使用

  1. 概念一个 Schema 模式2. 拿欠 Schema 发布也 Model3. 用 Model 创建
    Entity4. Entity 是享有现实的数据库操作 CRUD 的
    mongoose 的 connection 对象定义了部分波,比如 connected open close
    error 等,我们可监听这些事件。
    “`const mongoose = require(‘mongoose’);
    let db = mongoose.connect(‘mongodb://127.0.0.1:27017/test’);
    db.connection.on(‘error’, console.error.bind(console,
    ‘数据库连接失败:’));
    db.connection.once(‘open’, function() {   
    console.log(‘数据库连接成功!’);
        // 定义一个 Schema 模式    // new Schema() 中传入一个 JSON
    对象,定义属性与总体性类型    let PersonSchema = new mongoose.Schema({   
        name: {            type: String,            unique: true        }, 
          password: String    });
        // 将该 Schema 发布为 Model    let PersonModel =
    mongoose.model(‘col_1’, PersonSchema);
        // 拿到了 Model 对象,就可尽增删改查等操作了    //
    如果要是推行查询,需要靠 Model,当然 Entity 也是得形成的   
    PersonModel.find(function(err, result) {        // 查询到的有person   
    });
        // 用 Model 创建 Entity    let personEntity = new PersonModel({     
      name: ‘Krouky’,        password: ‘10086’    });
        // Entity 是有所现实的数据库操作 CRUD 的    //
    执行就后,数据库就出该数额了    personEntity.save(function(err,
    result) {        if (err) {            console.log(err);        } else
    {            console.log(`${result} saved!`);        }    });});
    “`

 

网站地图xml地图