mongodb在线语法测试: 这个是非常方便的验证语法的功能了
MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库。推荐的GUI管理工具Robo 3T。MongoDB将Json的数据存储为一个文档,但并不是我们能直接读取的普通文件。
基础概念:
- 数据库: 与Mysql的数据库类似
- collection: 与Mysql的
table
类似,集合 - document: 与MySQL的行
row
类似 - field: 与MySQL的列
column
类似 - index: 索引
- primary key: 主键,默认主键是
_id
应用场景
- 爬虫的数据存储,由于多个爬虫爬取数据时字段不统一,用mysql很容易浪费字段
安装配置
- Mongodb大版本之间差异比较大,最好安装最新版本,这是Release Notes
1 | sudo service mongod start # 安装完成后启动 |
系统相关指令
1 | mongo # 进入命令行 |
集合命令
1 | db.adminCommand({renameCollection: "db1.table1", "db1.table2"}) # 重命名集合 |
索引
- 索引相关,注意,ensureIndex在3.0已经弃用了,dropDup参数也弃用了
- 索引可以在数组字段上创建,这回给数组的每个元素都创建一个索引的
1 | db.col.getIndexes() # 获取当前collection的所有的索引 |
全文索引text
- 全文索引会对每一个词建立一个索引(3.2版本开始才支持中文)
CURD
document
表示一条json
数据
col
表示一张collection
的名称
查找数据
- 查询
_id
数据需要将字符串转换一下:{_id: ObjectId('6008c69ecf118e2bfb1e4237')}
1 | db.col.find(query, {'createdAt': -1, 'name': 1}) # 其中第二个参数,指定哪些字段返回,不返回哪些字段 |
插入数据
insertMany
等好多操作都是3.2版本才开始的,
1 | db.col.insert(document) # 会返回一个WriteResult对象 |
更新数据
1 | db.collection.update( |
删除数据
1 | db.collection.remove( |
备份与恢复
1 | 4.0以前可以使用这条命令直接复制数据库,但是那之后就只能用mongodump了 |
其他功能
Mongodb实现自增字段
MongoDB
没有原生的自增长功能,但是我们可以借助其原子性实现获取并设置自增字段的功能
首先创建一个专门用于保存自增当前索引值的集合
counters
:1
2
3
4{
"name": "my_table",
"sequence_value": 1
}创建一个获取并加一的函数
1
2
3
4
5
6
7
8
9
10
11function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify(
{
name: "my_table",
update: {
$inc:{sequence_value:1} // 只要读取一次就自增一
},
"new":true
});
return sequenceDocument.sequence_value;
}在创建
my_table
文档时只需要id=getNextSequenceValue('my_table')
即可
TroubleShooting
解决安装完mongo后无法启动的问题: 遇到一个安装完成后无论是
mongo
还是sudo service mongo start
还是sudo systemctl start mongod
都不报错但是实际上却没有启动的问题,可以这样解决,如果还是不行,可以去看/var/log/mongo
的日志,可能是磁盘空间不足引起的:1
2
3rm -rf /tmp/mongodb-27017.sock /var/lib/mongodb/mongod.lock
sudo systemctl start mongodb
sudo service mongodb start # 或者用这个启动