萌新最近在对付MongoDB,因此每天都在翻官方文档,这里随便做点笔记

ReplSet 与 Sharding

ReplSet 是副本集,也就是主从集合。可以用来做负载均衡,数据热备份。副本集的配置相对简单,数据库的角色就只有主机和从机两个概念(加上仲裁机)

Sharding 是数据分片,用来做海量数据的分布式管理,也可以起到负载均衡的效果。数据分片需要配置分片服务器(3台以上sharding),路由服务器(mongos),配置服务器(config)。通常配合副本集使用做数据库集群

  • 连接副本集: mongodb://db1.example.com:27017,db1.example.com:27017,db1.example.com:27017/dbname?replicaSet=rs0&username=abc&password=123&dataSource=admin
  • 连接分片库: mongodb://mongos.example.com:27017/dbname?username=abc&password=123&dataSource=admin
  • ReadConcern WriteConcern: 用来配置从集群读写策略,根据不同场景使用来平衡集群的实用性和可靠性
  • Read Preference:配置副本集的读取策略,跟 Read Concern有区别。

Security 用户认证

创建用户必须指定角色,和用来认证这个用户的库。

db.createUser({
user: "username",
pwd: "pwd123",
roles: [
{role: "readWriteAnyDatabase", db: "admin"}
]
});

添加时指定了哪个db,在认证时必须指定这个db。一般来说全局的角色都指定到admin中,除非是单一数据库用户才指定为某个db。

在连接的时候就可以指定用户名密码和认证数据库,这样连接成功后直接可以访问需要的数据库。

Aggregation 聚合

mongodb的聚合可以达到类似mysql的分组,排序,连接等效果,主要通过管道Pipeline命令集来实现

MONGODB MANUAL - Aggregation

简单介绍几个管道操作集合命令

  • $group 最常用的分组,内容是一个json文档指定分组后的各个字段,必须提供_id字段告诉mongodb来按哪个字段分组,比如按 a,b 字段分组,c求和,d计数,那么$group应该是这样
{
aggregate: 'table',
pipeline: [
{$group: {
_id: {a:1, b:1},
total: {$sum: "$c"},
count: {$sum: 1}
}}
]
}
// 结果
// [{_id: {a: "a", b: "b"}, total: 10, count: 2}, {_id: {a: "a", b: "c"}, total: 20, count: 3}]
  • $addFields, $project 组合字段

    $addFields 可以自定义新字段,如果要在$project中使用,需要带上$
// {_id: 1, name: "aa", class:"bbb", num: [2,5,3]}
{
aggregate: 'table',
pipeline: [
{$addFields: {
totalNum: {$sum: "$num"}
}},
{$project: {
name: 1, "$totalNum": 1 // 此处需要加$
}}
]
}
// 结果
// [{_id: 1, name: "aa", totalNum: 10}]
  • $match,$limit,$skip,$count,$sort 不多介绍,看名字就知道什么意思
  • $unwind 展开

    这是个很有意思的命令,配合数组字段使用,按数组元素的每一项展开,其他字段保留。效果看起来相当于其他字段组成一个表 left join 这个数组字段
// { "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] }
{
aggregate: 'table',
pipeline: [
{$unwind: "$size"}
]
}
// 结果
[
{ "_id" : 1, "item" : "ABC1", "sizes" : "S" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "M" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "L" }
]

可以通过配置参数达到left join , inner join , ifNull 等效果

另外,pipeline还有很多表达式操作符,可以很方便的组合使用来计算生成想要创建的新字段,随便举些例子:

  • 数学函数 $add,$abs,$log,$sqrt
  • 数组操作 $slice, $isArray
  • 数值比较 $eq, $lt
  • 非常实用的日期操作 $dateToString, $dateFromString

初用聚合格外注意

pipeline选项是一个数组

pipeline选项是一个数组

pipeline选项是一个数组

// db.aggregate()
db.collection.aggregate({
$match: {status: "1"},
$group: {_id: "$group", count: {$sum: 1}}
});// error
db.collection.aggregate([
{
$match: {status: "1"},
},{
$group: {_id: "$group", count: {$sum: 1}}
}
]);// 注意区别, $match 和 $group 是不同数组元素里的键,其他同理 db.runCommand({
aggregate: "tbname",
pipeline: [
{
$match: {status: "1"},
},{
$group: {_id: "$group", count: {$sum: 1}}
}
]
});

Command

其实mongodb的所有操作都可以通过构造一个 command document, 然后传给 runCommand 来实现

这与mongodb的设计也很一致,一切皆document.

MongoDB 深入学习 -- ReplSet,Sharding,Security,Aggregation,Command的更多相关文章

  1. NoSQL之【MongoDB】学习(三):配置文件说明

    摘要: 继上一篇NoSQL之[MongoDB]学习(一):安装说明 之后,知道了如何安装和启动MongoDB,现在对启动时指定的配置文件(mongodb.conf)进行说明,详情请见官方. 启动Mon ...

  2. Mongodb分片 学习小结

    前一篇 https://www.cnblogs.com/frx9527/p/mongodb.html 学会搭建复制集Replication之后,就可以学习分片Sharding了. 教程建议看官方文档: ...

  3. [转载]MongoDB开发学习(2)索引的基本操作

    索引能够极大的提高查询的效率.在数据库中简历索引必不可少. 在MongoDB中可以很轻松的创建索引. 默认索引_id_ 开启MongoDB服务器,创建数据库cnblogs,创建集合Users .(关于 ...

  4. 双刃剑MongoDB的学习和避坑

    双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档.所以我们在使用的过程中非常方 ...

  5. MongoDB的学习--索引类型和属性(转)

    原文链接:MongoDB的学习--索引类型和属性 索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field I ...

  6. MongoDB 自动分片 auto sharding

    MongoDB部署实验系列文章 MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情.MongoDB也在集群,分片,复制上也 ...

  7. mongodb数据库学习【安装及简单增删改查】

    //@desn:mongodb数据库学习 //@desn:码字不宜,转载请注明出处 //@author:张慧源  <turing_zhy@163.com> //@date:2018/08/ ...

  8. 转】MongoDB 自动分片 auto sharding

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! MongoDB 自动分片 auto shard ...

  9. Mongodb基础 学习小结

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

随机推荐

  1. Java开发需要注意的流程

    将一些需要变动的配置写在属性文件中 比如,没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置.那么你的程序无论在DEV环境中,还是TEST环境中,都可以顺畅无阻地运行,但是一旦部署在PROD ...

  2. DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...

  3. leetcode905

    vector<int> sortArrayByParity(vector<int>& A) { vector<int> EVEN;//偶数 vector&l ...

  4. Closest Common Ancestors

    Write a program that takes as input a rooted tree and a list of pairs of vertices. For each pair (u, ...

  5. latex中如何引用公式

    在使用latex编辑文章时,经常会需要引用公式.图表等等. 如果我们人为地对这些公式.图表进行编号1-2-3-4,然后在文章中使用Eq(1)-Eq(2)-Eq(3)-Eq(4)去引用这些公式,固然是可 ...

  6. ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\WWFDATA.dbf'

    错误提示如下图: ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\DB_DATA\SEINESCMDB\WWFDATA_DATA01.dbf' 分析原因及解决方法: 1.查看 ...

  7. sequelize 批量添加和更新数据 bulkCreate

    sequelize提供了批量插入数据的方法:Model.bulkCreate([…object]). 例如: let  updatePhone = [{userName: '李白‘},{userNam ...

  8. BeautifulSoup练习

    html1="""<!DOCTYPE html><html lang="en" xmlns="http://www.w3. ...

  9. 数字图像处理实验(8):PROJECT 04-04,Highpass Filtering Using a Lowpass Image 标签: 图像处理MATLAB 2017-05-25 0

    实验要求: 高通滤波器可以通过1减去低通滤波器的传递函数得到. 使用公式 计算可以的得到 . 实验代码: % PROJECT 04-04 Highpass Filtering Using a Lowp ...

  10. 16.数据类型(data_type)

    CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...