1.MongoDB与MySQL的对比
代码语言:javascript
复制# 与MySQL的对比
MySQL MongoDB
DB DB
table Collections # 表
row Documents # 行<单条数据>
column Field # 字段
2.MongoDB支持的字段数据类型
代码语言:javascript
复制# 支持的数据类型
String # 字符串,必须是utf-8
Boolean # 布尔值,true 或者 false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer # 整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double # 浮点数 (没有float类型,所有小数都是Double)
Arrays # 数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Object # 就是Python中的字典,这个数据类型就是字典
Null # 空数据类型 , 一个特殊的概念,None Null
Timestamp # 时间戳
Date # 存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
3.MongoDB 语言
代码语言:javascript
复制# 一般 cmd 的操作
# use db # 使用db数据库
# show dbs # 查看当前服务器中写在磁盘上的数据库
# show tables # 查看数据库中的collection
# db # 查看当前使用的数据库
3.1 增
代码语言:javascript
复制# insertOne
# 插入单条数据
# db.user_info.insertOne({name:'leon', age:22})
代码语言:javascript
复制# insertMany
# 插入多条数据
# db.user_info.insertMany([{name:'zhangsan', age:11}, {name:'lisi', age:22}])
3.2 删
代码语言:javascript
复制# 清空表内容
# db.表名.drop()
代码语言:javascript
复制# deleteOne
# 删除单条数据
# 删除 age=44 的
# db.user_info.deleteOne({age:44})
代码语言:javascript
复制# deleteMany
# 删除多条数据
# 删除名字是 'zhangsan' 或者 'lisi' 的
# db.user_info.deleteMany({name:{$in: ['zhangsan', 'lisi']}})
3.3 改
代码语言:javascript
复制# updateOne
# 修改单条数据
# 将名字叫 'zhangsan' 的 age 设定为 123
# 如果不存在 age 则增加一组键值 {'age':123}
# db.user_info.updateOne({name:'zhangsan'},{$set:{age:123}})
代码语言:javascript
复制# updateMany
# 修改多条数据
# 将名字是 'lisi' 或者 'zhangsan' 的 age 全部改成 250
# 如果不存在 age 则全部增加一组键值 {'age':123}
# db.user_info.updateMany({name:{$in: ['lisi','zhangsan']}},{$set:{age:250}})
3.4 查
代码语言:javascript
复制# 普通field 条件查询
db.user_info.find({age:11})
代码语言:javascript
复制# or 条件查询
# 查询 name='lisi' 或者 age=11 的
db.user_info.find({$or: [{name:'lisi'},{age:11}]})
代码语言:javascript
复制# and
# 查询 name='lisi' 并且 age=11 的
db.user_info.find({$and: [{name:'lisi'}, {age:22}]})
4.条件筛选
4.1 and & or
代码语言:javascript
复制# and
# 查询 name='lisi' 并且 age=11 的
db.user_info.find({$and: [{name:'lisi'}, {age:22}]})
代码语言:javascript
复制# or 条件查询
# 查询 name='lisi' 或者 age=11 的
db.user_info.find({$or: [{name:'lisi'},{age:11}]})
4.2 in & all
代码语言:javascript
复制# in
# field 是 查询条件的子集
# 查询 age 在 11,22,44 里面的
# db.user_info.find({age:{$in: [11,22,44]}})
代码语言:javascript
复制# all
# 查询条件是 field 的子集
# 查询 1,2,3 三个数字同时是哪些人喜欢的数字
# db.user_info.find({favourite_num:{$all: [1,2,3]}})
4.3大于、大于等于、小于等于、小于、等于
代码语言:javascript
复制# 查询 age=100 的
# db.user_info.find({age:{$gt:100}})
-- $gt # 大于
-- $gte # 大于等于
-- $lt # 小于
-- $lte # 小于等于
-- $eq # 等于
5. $ 修改器详解
5.1 $set
代码语言:javascript
复制# 将名字叫 'zhangsan' 的 age 设定为 123
# 如果不存在 age 则增加一组键值 {'age':123}
# db.user_info.updateOne({name:'zhangsan'},{$set:{age:123}})
代码语言:javascript
复制# 全部 修改/添加一组键值
# db.user_info.updateMany({条件},{$set:{age:111}})
5.2 $unset
代码语言:javascript
复制# 删除一组键值
# 将名字叫 'zhangsan' 的 {hobby:'girl'} 删除掉
# db.user_info.updateOne({name:'zhangsan'},{$unset:{hobby:'girl'}})
5.3 $inc
代码语言:javascript
复制# field 累加
# 每执行一次,age 字段就 1
# db.user_info.updateOne({name:'zhangsan'},{$inc:{age:1}})
代码语言:javascript
复制# 全部累加
# db.user_info.updateMany({条件},{$inc:{age:1}})
5.4 对于 Array 数组的操作
5.4.1 $push
代码语言:javascript
复制# 给数组添加一个 250
# db.user_info.updateOne({name:'zhangsan'},{$push: {hobby:250}})
代码语言:javascript
复制# 全部添加
# db.user_info.updateMany({条件},{$push: {hobby:250}})
5.4.2 $pull
代码语言:javascript
复制# 将数组的 250 删除掉
# db.user_info.updateOne({name:'zhangsan'},{$pull:{hobby:250}})
代码语言:javascript
复制# 全部删除
# db.user_info.updateMany({条件},{$pull: {hobby:250}})
5.4.3 $pop
代码语言:javascript
复制# 根据数组下表索引删除
# -1 代表第一个,1 代表最后一个,且只支持第一个和最后一个
# db.user_info.updateOne({name:'zhangsan'},{$pop:{hobby:1}})
代码语言:javascript
复制# 全部删除
# db.user_info.updateMany({},{$pop:{hobby:1}})
5.4.5 $ 单美元符表示下标
代码语言:javascript
复制# 将 'zhangsan' 的 hobby 数组里的 100 改成 250
# hobby 的 100 对应的索引会在市保存在 $ 里面,hobby.$ 会根据下标找到这个值并替换
# db.user_info.updateOne({name:'zhangsan', hobby:100},{$set: {'hobby.$':250}})
代码语言:javascript
复制# 全部修改
# db.user_info.updateMany({hobby:1},{$set: {'hobby.$':250}})
5.5 对 dict 字典的操作
代码语言:javascript
复制# info 是一个字典
# 将字典的 'weight' 改成 255
# db.user_info.updateOne({name:'zhangsan'},{$set:{'info.weight':255}})
代码语言:javascript
复制# 全部修改
# db.user_info.updateMany({条件},{$set:{'info.weight':255}})
5.6 数组嵌套字典
代码语言:javascript
复制# 结构如下
{
"_id" : ObjectId("5ea68688c178ca4438536715"),
"name" : "hehehe",
"age" : 112,
"info" : [
100,
{
"weight" : 100,
"height" : 175
}
]
}
代码语言:javascript
复制# 找到 'info.weight':111 所在字典对应的下标保存在 $ 里面,info.下标.属性 重新赋值
# db.user_info.updateOne({name:'张三', 'info.weight':111},{$set:{'info.$.height':250}})
5.7 limit 、skip 、sort 的使用以及分页的实现
5.7.1 limit
代码语言:javascript
复制# db.user_info.find({}).limit(5)
# 选取数据从当前位置选择5个
5.7.2 skip
代码语言:javascript
复制# db.user_info.find({}).skip(2)
# 从0开始跳过2条数据为当前位置
5.7.3 sort
代码语言:javascript
复制# db.user_info.find({}).sort({ id:-1 })
# 根据ID进行排序 -1倒叙 1正序
5.7.4 分页
代码语言:javascript
复制# limit skip sort实现查询分页
# db.user_info.find({}).limit(5).skip(10)
# db.user_info.find({}).limit(c).skip((p-1)*c)
# db.user_info.find({}).limit(5).skip(5).sort({ id:-1 })
代码语言:javascript
复制优先级最高的是 sort
其次优先为 skip
最低优先级 limit
6.pymongo 对 MongoDB 的增删改查
6.1创建连接
代码语言:javascript
复制import pymongo
# 根据 str 类型的 ObjectId 查询数据
from bson import ObjectId
# 创建连接
mongo_conn = pymongo.MongoClient(host='localhost', port=27017)
# 连接到 db1 的库
mongo_cli = mongo_conn['db1']
6.2 增
代码语言:javascript
复制# 创建一条数据
# mongo_cli.user_info.insert_one({'name': 'leon', 'age': 10})
代码语言:javascript
复制# 创建多条数据
# mongo_cli.user_info.insert_many([{'name': 'leon', 'age': 20}, {'name': 'bob', 'age': 18}])
6.3 删
代码语言:javascript
复制# 删除单条数据
# mongo_cli.user_info.delete_one({'name': 'leon'})
代码语言:javascript
复制# 删除多条数据
# mongo_cli.user_info.delete_many({'name': {'$in': ['leon', 'bob']}})
6.4 改
代码语言:javascript
复制# 修改单条数据
# mongo_cli.user_info.update_one({'name': 'leon'}, {'$set': {'age': 666}})
代码语言:javascript
复制# 修改多条数据
# mongo_cli.user_info.update_many({'name': {'$in': ['leon', 'bob']}}, {'$set': {'age': 120}})
6.5 查 & 如何根据 str 类型的 ObjectId 查询数据
代码语言:javascript
复制# from bson import ObjectId
# res = mongo_cli.user_info.find({'name': {'$in': ['leon', 'bob']}})
# for i in res:
# print(i)
# 如何根据 str 类型的 ObjectId 查询数据
# 测试,生成一个 str 的 ObjectId
# obj_id = str(mongo_cli.user_info.find_one({'name': 'leon'})['_id'])
# 嵌套即可
# res = mongo_cli.user_info.find_one({'_id': ObjectId(obj_id)})
# print(res)
6.6 Python 从 MongoDB 中取出数据修改后再提交
代码语言:javascript
复制# 取 MongoDB 数据直接更新再根据 _id 提交
res = mongo_cli.user_info.find_one({'name': 'leon'}) # type: dict
res['name'] = 'Belmont'
res['age'] = 18
res['hobby'] = ['game', 'girl']
mongo_cli.user_info.update_one({'_id': res.get('_id')}, {'$set': res})