---
url: /mongo.md
---
[Mongo-config](./Mongo-config.md)

## 基本命令

```
db.createUser({  user:'root',pwd:'root',roles:[ {  role:'userAdminAnyDatabase', db: 'test'},'readWriteAnyDatabase']});

db.createUser({"user":"root","pwd":"root","roles":[{role:"readWrite",db:"test"}]})

mongosh -u root -p root
show collections
db.xxx.drop()
 db.dropDatabase()
```

## 总结

一种使用文档来存储数据的非关系型数据库
MongoDB 是文档型 NoSQL，BSON 存储，副本集（高可用）+ 分片（水平扩展）；
索引基于 B + 树，复合索引遵循最左前缀，用 explain() 优化查询；
副本集选举靠 Raft 协议，奇数节点 + 多数派投票；
分片键选均匀分布字段，避免数据倾斜；
对比 MySQL：MongoDB 灵活易扩展，MySQL 事务强，核心业务选 MySQL。

WiredTiger（默认）	支持行级锁、压缩（Snappy/Zlib）、MVCC、事务

日志机制：
Journal 日志：预写日志（WAL），默认 100ms 刷盘，崩溃后可恢复；
Oplog 日志：副本集数据同步日志（固定大小的循环日志）。

MongoDB 分片集  核心组件：mongos（路由）、config server（配置）、shard（分片节点）；

绝大部分流行的数据库存储引擎都是基于 B/B+ Tree 或者 LSM(Log Structured Merge) Tree 来实现的

MongoDB 固定集合（Capped Collections）

## 示例

```sql

db.gitlab.aggregate([
    {
        "$group": {


            "_id": "$author_name",
            "count": {
                "$sum": 1
            }
        }
    }
]);


db.gitlab.aggregate([
    {
        $lookup:
        {
            from: "project",
            localField: "project_id",
            foreignField: "id",
            as: "project"
        }
    },
    {
        $unwind: "$project"
    },
    {
        $project: {
            author_name: 1,
            "project_name": "$project.name",
            "project_id": "$project.id"
        }
    },
    {
        "$group": {


            "_id": {
                "project_name": "$project_name",
                "project_id": "$project_id",

            },
            "count": {
                "$sum": 1
            }
        }
    },
    {
        "$sort": {
            "count": - 1
        }
    },
    {
        "$limit": 10
    },
    {
        "$addFields": {
            "is_large": {
                "$gte": ["$count", 500]
            }
        }
    },
    {
        $project: {
            "project_name": "$_id.project_name",
            "count": 1,
            "_id": 0,
            "is_large": 1
        }
    }
]);


db.project.find(
    {
        "path_with_namespace": {
            "$regex": /^e/i
        }
    }
)

```
