MongoDB适合储存大量关联性不强的数据!
无需预先设定表结构,并发写入速度远超过关系型数据库
Python中使用
链接数据库
本地库
如果是本机,且没有密码、默认端口
1 | from pymongo import MongoClient |
服务器链接
需要用rul形式链接
1 | from pymongo import MongoClint |
没有密码可以简写1
2from pymongo import MongoClint
client = MongoClient('mongodb://ip:port)
链接库与集合
方法1
直接
.数据库
与.集合
方式,常用
1 | from pymongo import MongoClient |
方法2
在批量操作多个库情况下推荐使用,可以用循环进行连接操作
1 | from pymongo import MongoClient |
批量操作示例
1 | data_list = ['data1', 'data2'] # 数据库名列表 |
pymong与原生区别
- 空值:MongoDB中
空为null
Python中None
, python中查空时必须写 null - 布尔值:MongoDB中
true 与 false
Python中 为大写 True与False - 排序: MongoDB中
sort({'age': -1})
一个字典参数, Python中sort('age', -1)
两个参数,字段、-1 - 查询id: MongoDB中可以直接查询
_id
pymongo 则需要安装依赖 bson 案例
写入数据
插入功能 | 描述 | 语法 |
---|---|---|
单条数据 | 原生语法 | insertOne(json) |
单条数据 | pymongo | collection.insert_one(json) |
批量数据 | 原生语法 | insertMany([json1,json2]) |
批量条数据 | pymongo | collection.insert_many([json1,json2]) |
往表插入单条 - 原生1
db.getCollection('data_1').insertOne({"name": "Zok","age": "18"})
往表插入多条 - 原生1
2
3
4
5db.getCollection('data_1').insertMany([
{"name": "Zok","age": "18"},
{"name": "kk","age": "22"},
{"name": "zz","age": "33"}
])
往表插入多条 - pymongo1
2
3
4
5
6
7
8
9from pymongo import MongoClient
client = MongoClient()
database = client['test_db']
collection = database['data_1']
collection.insert_many([
{'name': '小张', 'age': 10, 'address': '重庆'},
{'name': '小李', 'age': 20, 'address': '上海'},
])
查询
基础查找
查询功能 | 描述 | 语法 |
---|---|---|
查询所有 | 原生语法 | find({}) |
查询所有 | pymongo | 相同 |
指定字段 | 原生语法 | find({"字段1":"值1","字段2":"值2"}) |
指定字段 | pymongo | 相同 |
是否含有指定字段
1 | db.getCollection('db').find({'name': {'$exists': true}}) |
ID查询
原生id查询
1 | db.getCollection('data').find({'_id': ObjectId('xxxxx')}) |
pymongo中根据id查询,需要用到
bson模块
1 | from bson import ObjectId |
范围查找
查询功能 | 描述 | 语法 |
---|---|---|
大于 | 原生语法 | $gt |
大于等于 | 原生语法 | $gte |
小于 | 原生语法 | $lt |
小于等于 | 原生语法 | $lte |
不等于 | 原生语法 | $ne |
查找age大于20的 - 原生
1 | db.getCollection('data_1').find({ |
查age大于21小于24的,name不为小李 - 原生
1 | db.getCollection('data_1').find({ |
查age大于1小于24的,name不为小李 - pymongo
1 | from pymongo import MongoClient |
返回值
find()有2个参数,第一个是查找条件,第二个是返回值
查询返回 | 描述 | 语法 |
---|---|---|
不返回字段 | 原生语法 | find({},{'age':0}) |
不返回字段 | pymongo | 相同 |
返回指定 | 原生语法 | find({},{'age':1}) |
返回指定 | pymongo | 相同 |
返回符合的总条数 | 原生语法 | find(XXX).count() |
返回符合的总条数 | pymongo | 相同 |
限制返回结果 | 原生语法 | find(XXX).limit(4) |
限制返回结果 | pymongo | 相同 |
注意:mongo查询默认返回一个 _id ,如果不想要,就设置{'_id':0}
排序
查询返回 | 描述 | 语法 |
---|---|---|
排序 | 原生语法 | find(XXX).sort({'age': -1}) -1 倒序 1正序 |
排序 | pymongo | find(XXX).sort('age', -1) -1 倒序 1正序 |
修改数据
修改 | 描述 | 语法 | 详细 |
---|---|---|---|
单条修改 | 原生语法 | updateOne |
只更新满足条件的第一个 |
单条修改 | pymongo | update_one |
只更新满足条件的第一个 |
批量修改 | 原生语法 | updateMany |
更新所有 |
批量修改 | pymongo | update_many |
更新所有 |
更新或删除【参数】 | pymongo | upsert |
没有就新增,有就更新 |
- 参数1: 与find相同,查找语句
- 参数2: 为一个dict类型, key为 ‘$set’ 值为另一个字典
修改示例 - 原生1
2
3
4db.getCollection('data_1').updateMany(
{"name": "Zok"},
{"$set": {"address": "重庆","age": 22}}
)
修改示例 - pymongo
对name为小张的, 将age改为80, 地址改为日本
1 | from pymongo import MongoClient |
upsert参数示例 - pymongo
如果有记录就更新,没有就新增进去
1 | """案例同上""" |
删除数据
删除功能,用法同插入功能,对应
deleteOne
与deleteMany
强烈建议先查找再删除
删除功能 | 描述 | 语法 |
---|---|---|
单条数据 | 原生语法 | deleteOne(json) |
单条数据 | pymongo | delete_one(json) |
批量数据 | 原生语法 | deleteMany([json1,json2]) |
批量条数据 | pymongo | delete_many([json1,json2]) |
删除重复数据
修改表名。与去重的字段名即可
Demo去重的表名play_info
去重字段店名
1 | db.getCollection('play_info').aggregate([ |
伪删除方法
删除功能要慎用,所以这里推荐一种假性删除方法,就是在字段中增加一个deleted字段
该字段初始值为0 也就是存在。 我们将要删除的值对应的deleted值改为1,代表被删除。 这样我们就可以灵活控制了,即使错误操作也能简单回滚!
数据去重
distinct()
可以接收2个参数
参数1:字段名,表示对谁去重
参数2:查询命令find()的第一个参数,可以忽略
返回值: 返回数组,里边是去重后的值
去重功能 | 描述 | 语法 |
---|---|---|
数据去重 | 原生语法 | distinct('字段名', 查询语句的第一个字典) |
数据去重 | pymongo | 相同 |
案例
- 对age字段去重
1 | db.getCollection('data1').distinct('age') |
- 特定条件数据去重,先查age大于24,再去重
1 | db.getCollection('data1').distinct( |
分组词频统计
查找统计制定字段分组后词频。
1 | db.getCollection('表名').aggregate([ |
建立索引
1 | db.getCollection('name').createIndex({"title":1}) |
检查索引
1 | db.col.getIndexes() |
查看索引大小1
db.col.totalIndexSize()
备份、导入、迁移
整个过程无需进入 mongo 环境
备份
1
mongodump -h 127.0.0.1:27017 -d "备份库名" -o "储存路径" -u "user" -p "password" --authenticationDatabase "admin"
注意! 上面是有账号密码的情况下
如果没有账号1
mongodump -h 127.0.0.1:27017 -d "备份库名" -o /src/test/mogo
- 导入
导入库名可以与备份的文件名不同1
mongorestore -h 127.0.0.1 -d "导入哪个库" "储存路径" -u "user" -p "password" --authenticationDatabase "admin"
mongo 时间格式
ISODate()
生成的就是mongodb的时间格式,但是这是 mongodb 语法
1 | // 这是我在更新追加一个时间戳, 来甄别更新数据时间 |
python操作
1 | import dateutil.parser |