---
title: "Mongodb 笔记"
date: 2019-10-30T10:56:11+08:00
lastmod: 2019-10-30T10:56:11+08:00
keywords: []
tags: ["mongodb"]
categories: ["database"]
---

## 数据迁移
### 导出集合数据到 json 或 csv 文件
- 命令
    ```
    mongoexport -d dbname -c collectionname -o file --type json/csv -f "field1,field2,...,fieldN"
    ```
- 参数
    - -d 数据库名
    - -c 集合名
    - -o 输出文件名
    - --type 输出格式，默认 json
    - -f 输出字段，如果导出 csv，需指定字段名

### 导入数据到集合
- 命令
    ```
    mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f "field1,field2,...,fieldN"
    ```
- 参数
    - -d 数据库名
    - -c 集合名
    - --type 导入格式，默认 json
    - -f 导入的字段名
    - --headerline 导入csv时，使用第一行的标题作为导入字段
    - --file 导入的文件

### 备份数据库
- 命令
    ```
    mongodump -h dbhost -d dbname -o backup_dir
    ```
- 参数
    - -h ip[:port]
    - -d 数据库名
    - -o 备份数据存放目录，需提前建立

### 恢复数据库
- 命令
    ```
    mongorestore -h dbhost -d dbname --dir backup_dir
    ```
- 参数
    -h ip[:port]
    -d 数据库名
    --dir 备份数据存放目录
    --drop 恢复前，先删除当前数据


## 操作数据库
- 默认数据库 test
- 创建 use dbname
- 查看当前选择的数据库 db
- 查看数据库列表 show dbs，不显示空数据库
- 删除数据库 use dbname; db.dropDatabase()

## 操作集合
### 创建
```
db.createCollection("集合名", {capped:false, autoIndexId:false, size:最大字节, max:文档最多数量})
## 或者在插入文档时自动创建
db.集合名.inert({})
```

### 删除
```
db.集合名.drop()
```

## 操作文档
### insert
- 插入一个文档
    ```
    db.集合名.insert({})
    # 或者
    db.集合名.insertOne({})
    ```
- 插入多个文档
    ```
    db.集合名.insert([{},{},{},...,{}])
    # 或者
    db.集合名.insertMany([{},{},{},...,{}])
    ```

### find
- 查询匹配的文档
    ```
    db.集合名.find({}).pretty()
    ```
- 查询，只返回一个文档
    ```
    db.集合名.findOne({})
    ```
    - 相等 {"key":"value"}
    - 小于 {"key":{$lt:"value"}}
    - 小于等于 {"key":{$lte:"value"}}
    - 大于 {"key":{$gt:"value"}}
    - 大于等于 {"key":{$gte:"value"}}
    - 不等于 {"key":{$ne:"value"}}
    - and {$and:[{},{}]}
    - or {$or:[{},{}]}
- 投影
    ```
    db.集合名.find({},{"key1":1,"key2":0 ...})
    ```
- 限制返回文档数量
    ```
    db.集合名.find({}).limit(N)
    ```
- 跳过返回文档数量
    ```
    db.集合名.find({}).limit(N).skip(N)
    ```
- 排序，1升序，-1降序
    ```
    db.集合名.find({}).sort({"key":1})
    ```

### update
- 更新一个文档
    ```
    db.集合名.update({},{$set:{}})
    ```
- 更新多个文档
    ```
    db.集合名.update({},{$set:{},{multi:true}})
    ```

### save
```
db.集合名.save({,...})
```

### remove
- 删除多条记录
    ```
    db.集合名.remove({})
    ```
- 删除一条记录
    ```
    db.集合名.remove({},1)
    ```
- 删除集合中的所有文档，相当于 truncate
    ```
    db.集合名.remove()
    ```

### 索引
- 创建索引，1升序，-1降序
    ```
    db.集合名.createIndex({"key1":1,"key2":-1})
    ```

### 聚合
```
db.集合名.aggregate([{}])
```

## 用户
### 创建用户
- 管理员权限
    ```
    use admin
    db.createUser(
        {
            user: "username",
            pwd: "password",
            roles: [{role: "root", db: "admin"}]
        }
    )
    ```
- 测试库读写权限
    ```
    use testdb
    db.createUser(
        {
            user: "username",
            pwd: "password",
            roles: ["readWrite"]
        }
    )
    ```

### 验证身份
```
db.auth("username", "password")
```

### 列出所有用户
```
db.getUsers()
```

### 删除数据库用户
```
use testdb
db.dropUser("username")
```

### 更改用户密码
```
db.updateUser(
    "username",
    {
        pwd: "new_password"
    }
)
```

