day120-day121-MongoDB的基础增删改查&pymongo的使用

2020-04-29 11:39:24 浏览数 (1)

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})

0 人点赞