MongoDB 4.2 正式发布 引入分布式事务

by admin on 2020年2月15日

澳门新葡亰网址下载 1

MongoDB – 简介

官网:

MongoDB 是叁个根据分布式文件存款和储蓄的数据库,由 C++ 语言编写,目的在于为 WEB
应用提供可增加的高质量数据存款和储蓄建设方案。

MongoDB
是二个在于关周到据库和非关周到据库之间的制品,是非关周全据库在那之中效率最丰裕,最像关周全据库的。

 

 

 

  • 分布式事务将 MongoDB 的多文书档案 ACID
    从别本集扩大到分享集群,可感到越来越宽广的用例服务

  • 按需物化视图使用新的 $Merge
    运算符,在联谊中缓存大型聚合的出口是风流倜傥种广泛的方式,新的 $Merge
    运算符将能够有效地改过那几个结果,并不是完全重复计算它们

  • 通配符索引使建立模型像付加物目录这样的惊人异构的汇集变得轻易和自然,而不捐躯对索引的援救。只需定义一个过滤器,它将自行索引集结中兼有相配的字段、子文书档案和数组

  • MongoDB
    查询语言巩固功效
    ,如更有表现力的翻新、新的数学生运动算符和扩张的 regex
    扶植。此版本的 update 和 findAndModify
    命令能够援引现存字段,并投入聚合管道,以博得越来越强的表现力

  • 可还原读写,降低了编辑管理一时集群故障的代码的目迷五色

MongoDB – 安装及运营

  1. 下载

07/05/2017 Current Stable Release (3.4.6)

  1. 始建数量目录

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

1
E:MongoDBdatadb
  1. 运行 MongoDB 服务器

为了从命令提醒符下运转MongoDB服务器,你必需从MongoDBbin目录中进行mongod.exe文件,不要关闭服务。ctrl + c关闭。

1
mongod.exe –dbpath E:MongoDBdatadb
  1. MongoDB 后台管理

运行 mongo.exe

MongoDB Shell是MongoDB自带的人机联作式Javascript
shell,用来对MongoDB举行操作和关押的人机联作式情状。

  1. 将 MongoDB 服务器作为 Windows 服务运作

加多系统意况 path E:MongoDBServer3.4bin

检测:cmd 中输入 mongod --help

新建文件:E:MongoDBlogslogs.log

将 MongoDB 服务器作为 Windows 服务随 Windows 运行而开启:

1
mongod.exe –logpath "E:MongoDBlogslogs.log" –logappend –dbpath "E:MongoDBdata" –directoryperdb –serviceName MongoDB –install

澳门新葡亰网址下载 ,开启 MongoDB 服务:net start MongoDB

停止 MongoDB 服务:net stop MongoDB

删除 MongoDB 服务:sc delete MongoDB

接下去就能够在 cmd 中运维 E:MongoDBServer3.4bin 里面的 *.exe
程序了

  • shell 控制台 mongo
  • 数据库的还原 mongorestore
  • 备份 mongodump
  1. mongodb 运行的参数

 

澳门新葡亰网址下载 2

 

客户端字段级加密(FLE,Client-side Field Level EncryptionState of Qatar现已然是 MongoDB
4.2 的生龙活虎有的,可以在 beta 版中接受。使用
FLE,能够选择性地敬服文书档案中的敏感字段,各样字段都采纳自身的密钥加密,并在客户端上无缝解密。

mongoDB – 主要特征

  • MongoDB安装简便。
  • MongoDB的提供了二个面向文书档案存款和储蓄,未有表布局的定义,每一天记下能够有一同两样的布局,操作起来比较容易和易于。
  • 全然的目录援助(单键索引、数组索引、全文索引、地理地点索引 等)
  • 您能够因此当地也许互连网创制数量镜像,那使得MongoDB有更加强的扩张性。
  • 若果负载的增添(需求越来越多的蕴藏空间和更加强的拍卖本事)
    ,它能够布满在微电脑互联网中的其余节点上那正是所谓的分片。
  • Mongo援助增多的询问表明式。查询指令使用JSON格局的暗号,可随机查询文书档案中内嵌的目的及数组。
  • MongoDb
    使用update(State of Qatar命令能够兑现替换完毕的文书档案(数据)也许局地点名的多寡字段
  • 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
是现代应用程序的通用数据库,它汇集了文书档案模型、智能遍布式系统以至在任哪个地方方运作它的手艺,从台式机计算机到大型机,在集体和私有云中运作。固然以
MongoDB 4.2 为例,最快和最简便易行的章程是在 MongoDB Atlas
上运转三个集群,在 AWS、Azure 和 GCP 上的 60 多少个区域都足以运用。

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管理工科具
  • 罗克Mongo — 最好的PHP语言的MongoDB管理工科具,轻量级, 扶持多国语言.

抑或能够在协和的底工设备上下载并运营 4.2。通过 MongoDB Enterprise
Operator for Kubernetes,你能够让 Kubernetes 陈设和治本 MongoDB。

mongoDB – 三大重要概念

 

澳门新葡亰网址下载 3

 

详细情况见发布表明:

1. database 数据库

四个集聚逻辑上集体在联合具名,便是数据库。

数据库命名标准:

  • 不能是空字符串(””卡塔尔。
  • 不得含有’ ‘(空格State of Qatar、.、$、/、和 (空字符)。
  • 应全体大写。
  • 最多64字节。

有局部数据库名是保留的,能够一直访谈这么些有特殊功能的数据库。

  • admin:
    从权力的角度来看,那是”root”数据库。假若将七个客商拉长到那么些数据库,这么些顾客自行三回九转全数数据库的权位。一些一定的服务器端命令也只好从那些数据库运营,举例列出全数的数据库也许关闭服务器。
  • local:
    这些数目恒久不会被复制,能够用来囤积限于本地单台服务器的轻易集结
  • config:
    当Mongo用于分片设置时,config数据库在里面选取,用于保存分片的相干音信。

2. collection 集合

多个文书档案组成四个集聚,约等于关周密据库的表。

具备存款和储蓄在集结中的数据都以 BSON 格式,BSON 是类 JSON
的风流洒脱种二进制格局的蕴藏格式,简单称谓 Binary JSON。

集结名命名规范:

  • 集结名不能是空字符串””。
  • 会集名不能够含有字符(空字符卡塔尔国,那些字符表示群集名的末梢。
  • 集结名不能够以”system.”开头,那是为系统集结保留的前缀。
  • 顾客创制的会面名字不可能含有保留字符。某个驱动程序的确辅助在集结名里面包罗,那是因为有些系统生成的集聚中蕴藏该字符。除非你要访谈这种系统创制的聚焦,不然千万不要在名字里现身$。 

澳门新葡亰网址下载 4

(文/开源中黄炎子孙民共和国State of Qatar    

3. document 文档

MongoDB 将数据存款和储蓄为一个文书档案,数据构造由键值对组合。

MongoDB 文书档案是后生可畏组键值对(即BSON,二进制的 JSON卡塔尔,形似于 JSON
对象。字段值能够包蕴其余文书档案,数组及文书档案数组。

文书档案键命名标准:

  • 键不可能含有 (空字符卡塔尔。那个字符用来表示键的末尾。
  • .和$有非常的意思,独有在一定条件下技术利用。
  • 以下划线”_”开端的键是保留的(不是严酷必要的State of Qatar。

要求小心的是:

  • 文书档案中的键值对是稳步的。
  • 文书档案中的值不只可以够是在双引号里面的字符串,还足以是其他三种数据类型(以至足以是一切嵌入的文书档案卡塔尔(قطر‎。
  • MongoDB区分类型和分寸写。
  • MongoDB的文书档案不能有重复的键。
  • 文书档案的键是字符串。除了少数例外情状,键能够利用任意UTF-8字符。

 

image

MongoDB – 数据类型

ObjectId:主键,豆蔻梢头种特有而且非常紧要的品种,每一个文书档案都会暗中认可配置这么些天性,属性名称为_id,除非本人定义,方可覆盖

 

澳门新葡亰网址下载 5

 

MongoDB – 清汤寡水操作

翻看当前数据库

1
db

查看全部数据库

不曾数据的数据库不予突显

MongoDB 中默许的数据库为 test,如若您未有成立新的数据库,集结将存放在
test 数据库中。

1
show dbs

一连到钦点的数据库

若果数据库不设有,则开创数据库,不然切换来钦命数据库。

1
use db_name

查阅服务器状态

1
db.serverStatus()

翻开数据库计算信息

1
db.stats()

删除数据库

1
db.dropDatabase()

查看数据库中享有会集

1
2
3
show tables
show collections

清空集结

删除里面包车型地铁文书档案,但集合还在

1
db.col_name.remove({})

除去集结

1
db.col_name.drop()

查看集合详细消息

MongoDB 的3.0后的版本分了二种形式queryPlanner、executionStats、allPlansExecution

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

MongoDB – 增加和删除改查

插入

MongoDB 使用 insert(卡塔尔 或 save(卡塔尔(قطر‎ 方法向聚集中插入文书档案:

倘使该集结不在该数据库中, MongoDB 会自动创设该集合併插入文档。

insert(卡塔尔(قطر‎ 或 save(State of Qatar 方法都足以向collection里插入数据,两个分别:

  • 若果不钦定 _id 字段,save() 方法恍如于 insert(卡塔尔 方法。尽管钦命
    _id 字段,则会更新该 _id 的数据。
  • 使用save函数,假设原来的指标不设有,那她们都足以向collection里插入数据,要是已经存在,save会调用update更新里面包车型地铁笔录,而insert则会忽视操作
  • insert能够一遍性插入二个列表,而不用遍历,功用高,
    save则要求遍历列表,叁个个插入。
1
2
3
db.col_name.insert(document)
 
db.col_name.save(document)

布置叁个文书档案到 col 集结中:

1
2
3
4
5
6
7
8
db.col_1.insert({
title: ‘MongoDB 教程’,
description: ‘MongoDB 是一个 Nosql 数据库’,
by: ‘菜鸟教程’,
url: ‘http://www.runoob.com’,
tags: [‘mongodb’, ‘database’, ‘NoSQL’],
likes: 100
})

也足以将文书档案数据定义为一个变量,如下所示:

1
2
3
4
5
6
7
8
9
10
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(卡塔尔命令来判别实行的条件是不是正确,那是三个比较好的习贯。

1
2
3
4
5
6
7
8
9
10
11
db.col_name.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
 
– query :(可选)删除的文档的条件。
– justOne : (可选)如果设为 true 或 1,则只删除一个文档。
– writeConcern :(可选)抛出异常的级别。

剔除集结中持有文书档案

1
db.col.remove({})

移除 col_1 会集中 title 为 MongoDB save 的文档,只删除第一条找到的笔录

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

更新

MongoDB 使用 update(卡塔尔 和 save(State of Qatar 方法来更新集结中的文书档案

update() 方法用以改革已存在的文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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(State of Qatar 方法来更新 col_1 会集中的 title

$set 操作符为部分更新操作符,只更新 $set
之后的多少,并不是覆盖在此以前的多寡

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

以上语句只会改正第一条发掘的文书档案,假如要改善多条雷同的文书档案,则必要设置
multi 参数为 true。

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

save() 方法通过传播的文书档案来替换本来就有文书档案。语法格式如下:

1
2
3
4
5
6
db.col_name.save(
<document>,
{
writeConcern: <document>
}
)

以下实例中大家交替了 col_1 的文书档案数据:

1
2
3
4
5
6
7
8
9
10
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(State of Qatar 方法,它只回去一个文书档案。

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

格式化输出:

1
db.col_name.find().pretty()

翻看集合汉语档的个数:

1
db.col_name.find().count()

跳过钦命数量的数额:

1
db.col_name.find().skip()

读取钦定记录的条数:

1
db.col_name.find().limit()

排序:

sort(卡塔尔方法能够因此参数内定排序的字段,并运用 1 和 -1
来钦赐排序的方法,个中 1 为升序排列,而-1是用来降序排列。

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

sort(卡塔尔(قطر‎方法能够透过参数钦定排序的字段,并选择 1 和 -1
来钦定排序的议程,个中 1 为升序排列,而-1是用来降序排列。

Where 语句

假诺你想获取”col”集合中 “likes” 大于100,小于 200
的数目,你能够利用以下命令:

1
2
3
4
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

 

澳门新葡亰网址下载 6

 

$type 操作符

用来探究集合中十二分的数据类型

 

澳门新葡亰网址下载 7

 

如若想博得 “col” 集结中 title 为 String 的数码,你能够应用以下命令:

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

AND 条件

find(State of Qatar 方法能够流传多少个键(key卡塔尔国,各个键(key卡塔尔(قطر‎以逗号隔开分离,语法格式如下:

1
2
3
4
db.col_name.find({key1:value1, key2:value2}).pretty()
 
// 类似于 SQL and 语句:
SELECT * FROM col_name WHERE key1=’value1′ AND key2=value2

OR 条件

1
2
3
4
db.col_name.find({ $or: [{ "by": "菜鸟教程" }, { "title": "MongoDB 教程" }] }).pretty()
 
// 类似于 SQL or 语句:
SELECT * FROM col_name WHERE key1=value1 OR key2=value2

AND 和 OHaval 联合利用

1
2
3
4
5
6
7
8
9
10
11
12
13
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 查看集合索引景况

1
db.col_name.getIndexes()

hint 强制行使索引

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

删去索引(不会去除 _id 索引)

1
2
3
db.col_name.dropIndexes()
 
db.col_name.dropIndex({firstname: 1})

createIndex() 方法

MongoDB使用 createIndex(卡塔尔(قطر‎ 方法来成立索引

key 为你要制造的索引字段,1为按升序创造索引,-1为按降序创造索引。

也足以安装使用多少个字段创设索引(关系型数据库中称作复合索引)

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

createIndex(卡塔尔国 采用可选参数,可选参数列表如下:

 

澳门新葡亰网址下载 8

 

_id 索引

对此每一个插入的多少,都会自动生成一条唯朝气蓬勃的 _id 字段,_id
索引是大非常多汇聚暗许建设构造的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> 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 命名空间,由数据库名称.集合名称组成

单键索引

最多如牛毛的目录,不会活动创造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 对 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中插入数组类型的多键数据,索引是机动建构的,无需特意内定

1
2
3
4
5
6
7
8
9
10
> 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 ] }

复合索引

並且对多个字段创立索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
> 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(提姆e To
Live,生存时间)索引,即在大器晚成段时间后会过期的目录(如登入音信、日志等)

过期后的索引会连同文书档案一同删除

expireAfterSeconds:钦命叁个以秒为单位的数值,设定集合的活着时间。

注意:

  • 仓库储存在过期索引字段的值必得是点名的小时等级次序(必需是 ISODate 或
    ISODate 数组,不可能动用时间戳,否则不可能被自动删除)
  • 尽管钦定了 ISODate 数组,则根据最小的光阴实行删除
  • 过期索引不能够是复合索引(不能够钦命八个过期时间)
  • 剔除时间存在多少抽样误差(1 分钟左右)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
> 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 函数一齐利用功用越来越好

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

注意:

  • 每种集结只可以成立四个全文索引
  • MongoDB 从 2.4 版本早先支持全文字笔迹核准索,从 3.2 版本开首帮衬普通话
  • (好像)只好对全部单词查询,不能够对单词的截取部分查询
  • 注重词之间的空格表示
  • 尤为重要词早前的 – 表示
  • 首要词加引号表示 (需用 转义)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
> 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
中会面首要用来拍卖多少(如平均值,求和等State of Qatar,并回到总结后的多寡结果。相符sql语句中的
count(*)。

aggregate() 方法

1
db.col_name.aggregate(AGGREGATE_OPERATION)

下表显示了大器晚成部分聚众的表明式:

 

澳门新葡亰网址下载 9

 

实例

估测计算各种笔者所写的稿子数

在上面包车型大巴例证中,大家经过字段by_user字段对数据开展分组,并总结by_user字段雷同值的总额。

聚聚焦的数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
"_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(卡塔尔国总计结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
4
5
6
7
8
9
10
11
12
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管道操作符举办拍卖。

1
2
3
4
5
6
7
db.articles.aggregate([
{ $match: { score: { $gt: 70, $lte: 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
]);
 
// 返回
{ "_id" : null, "count" : 1 }

$skip 实例

由此 $skip 管道操作符管理后,前2个文档被”过滤”掉。

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

MongoDB – 复制

MongoDB 复制(副本集)是==将数据同步在两个服务器==的历程。

复制提供了数额的冗余备份,并在七个服务器上囤积数据别本,升高了多少的可用性,
并能够保证数据的安全性。

特点:

  • 维持数据的安全性
  • 多少高可用性 (24*7)
  • 不幸复苏,复制允许你从硬件故障和服务中断中回复数据。
  • 无须停机维护(如备份,重新建立索引,压缩)
  • 分布式读取数据

  • N 个节点的集群

  • 别的节点可看成主节点

  • 装有写入操作都在主节点上
  • 自行故障转移
  • 自动还原

复制原理

mongodb 的复制起码须求三个节点。

  • 内部叁个是==主节点==,担任处理客商端恳求,
  • 其它的皆以==从节点==,担负复制主节点上的数码。

mongodb各样节点何奇之有的映衬方式为:生机勃勃主风流洒脱从、大器晚成主多从。

主节点记录在其上的持有操作oplog,从节点准期轮询主节点获取这么些操作,然后对和谐的多少别本实践这一个操作,进而确定保证从节点的多寡与主节点风姿洒脱致。

 

image

复制设置

  1. 闭馆正在运作的MongoDB服务器。

方今大家经过点名 –replSet 选项来运行mongoDB

1
mongod –port "PORT" –dbpath "YOUR_DB_DATA_PATH" –replSet "REPLICA_SET_INSTANCE_NAME"

实例:

上边实例会运转叁个名称为rs0的MongoDB实例,其端口号为27017。

起步后展开命令提醒框并三翻五次上mongoDB服务。

在Mongo客商端使用命令rs.initiate(卡塔尔(قطر‎来运行叁个新的副本集。

我们能够动用rs.conf(卡塔尔来查阅别本集的铺排

查阅副本集状态使用 rs.status(卡塔尔国 命令

1
mongod –port 27017 –dbpath "D:set upmongodbdata" –replSet rs0

别本集增多成员

增进别本集的分子,大家供给选拔多条服务器来运转mongo服务。

跻身Mongo客户端,并应用rs.add(卡塔尔(قطر‎方法来增加副本集的成员。

1
rs.add(HOST_NAME:PORT)

实例:

假设你曾经运转了三个名叫 mongod1.net,端口号为27017的Mongo服务。

在客商端命令窗口使用rs.add(卡塔尔国 命令将其增加到副本集中,命令如下所示:

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

MongoDB 中您不能不通过主节点将Mongo服务增添到副本聚焦,
推断当前运转的Mongo服务是还是不是为主节点能够接收命令

1
db.isMaster()

MongoDB的别本集与大家周围的宗旨有所差异,主从在主机宕机后全数服务将终止,而别本集在主机宕机后,别本会接管主节点改为主节点,不会并发宕机的情事。

MongoDB – 分片

当MongoDB存款和储蓄海量的数目时,==生龙活虎台机械或许不足以存款和储蓄数据==,也恐怕不足以提供可接收的读写吞吐量。那时候,我们就能够由此在多台机械上划分数据,使得数据库系统能积累和拍卖更加的多的多寡。

何以使用分片?

  • 复制所有的写入操作到主节点
  • 延期的敏锐性数据会在主节点查询
  • 单个副本集约束在13个节点
  • 当须求量庞大时会现身内部存款和储蓄器不足。
  • 本地球磁性盘不足
  • 垂直增加价格高昂

分片集群构造

 

image

多个主要组件:

  • Shard: 用于储存实际的数据块,实际临盆条件中贰个shard
    server角色可由几台机器组个多个replica set担任,幸免主机单点故障
  • Config Server: mongod实例,存款和储蓄了全体 ClusterMetadata,个中包蕴chunk新闻。
  • Query Routers:
    前端路由,顾客端由此接入,且让总体集群看上去像单生龙活虎数据库,前端接纳能够透明使用。

MongoDB – 监控

督察能够通晓 MongoDB 的==运维状态==及==质量==

MongoDB中提供了 mongostat 和 mongotop 多个指令来监督MongoDB的运作情形。

mongostat

它会间隔固按期期获得 mongodb 的脚下运营景况,并出口。

倘使您意识数据库猛然变慢也许有其它难题的话,你一直的操作就思谋采取mongostat 来查阅 mongo 的情景。

1
mongostat

 

澳门新葡亰网址下载 10

 

mongotop

mongotop用来追踪MongoDB的实例,提供每一种会集的总计数据。默许情况下,mongotop每生机勃勃秒刷新三次。

1
mongotop

 

澳门新葡亰网址下载 11

 

出口结果字段表明:

  • ns:满含数据库命名空间,后面一个结合了数据库名称和汇集。
  • db:包括数据库的称谓。名称叫 . 的数据库针对全局锁定,而非特定数据库。
  • total:mongod耗费的时光工作在此个命名空间提供总额。
  • read:提供了大气的岁月,这mongod花销在实行读操作,在那命名空间。
  • write:提供那一个命名空间拓宽写操作,那mongod花了多量的日子。

等候的年华长短,以秒为单位,私下认可 1s

1
mongotop 10

报告每一个数据库的的使用

1
mongotop –locks

MongoDB – 备份与回复

mongodump

在Mongodb中大家选拔 mongodump 命令来备份MongoDB数据。

该命令能够导出全体数据到内定目录中。

mongodump命令能够由此参数内定导出的数码量级转存的服务器。

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

实例

备份 mongodb_study 数据库中的全体集结到 E:MongoDBdump

1
mongodump -h 127.0.0.1 -d mongodb_study -o E:MongoDBdump

不带别的参数,即在当前目录下备份全数数据库实例

1
mongodump

备份全数MongoDB数据

1
2
3
4
mongodump –host HOST_NAME –port PORT_NUMBER
 
// 如
mongodump –host w3cschool.cc –port 27017

备份钦赐数据库的聚众

1
2
3
4
mongodump –collection COLLECTION_NAME –db DB_NAME
 
// 如
mongodump –collection mycol –db test

mongorestore

在Mongodb中大家采用 mongorestore 命令来复苏MongoDB数据。

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

实例

重整旗鼓寄存在 E:MongoDBdump 中的数据库
mongodb_study,复苏前后的数据库名不必相近

1
mongorestore -h localhost /db mongodb_study /dir E:MongoDBdumpmongodb_study

Node.js 连接 MongoDB

与 MySQL 不一致的是 MongoDB
会自动创设数据库和集纳,所以使用前大家没有必要手动去创建。

设置驱动:npm install mongodb

运行 node:node connect

实例

connect.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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学习参照他事他说加以侦察文书档案——幼功篇:

mongoose学习笔记:

mongoose学习文书档案:

Nodejs学习笔记(十九)—
Mongoose介绍和入门:

Mongoose全面驾驭:

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 五个基本点概念

 

澳门新葡亰网址下载 12

 

Schema、Model、Entity
的涉嫌:Schema生成Model,Model创设Entity,Model和Entity都可对数据库操作导致影响,但Model比Entity更具操作性。

1. Schema 模式

Schema 对象定义==文书档案布局==,能够定义字段、类型、唯大器晚成性、索引、验证等。

Schema
不唯有定义了文书档案结构和使用质量,还足以有扩展插件、实例方法、静态方法、复合索引、文书档案生命周期钩子

1
2
3
4
5
// 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 等,大家可以监听这几个事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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地图