MongoDB 深入学习 -- ReplSet,Sharding,Security,Aggregation,Command

萌新最近在对付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.

猜你喜欢

转载自www.cnblogs.com/dapianzi/p/9265783.html