一 . 先说一下mysql和MongoDB对比



MySql                MongoDB

database    ==        database/db
table       ==        collection
colunm      ==        field
row         ==        documents



一 . 增



use   不存在的数据库     #直接创建数据库,但是存在内存中,不在磁盘上
db.不存在的表名     # 创建表,也是存在内存中
# 当往表里插入数据的时候就自动写在了磁盘上

db.表名.insertOne({"key":"value"})   #插入一条数据
db.msg.insertOne({'name':'attila'})

db.表名.insertMany([{"key":"value"},{"key":"value"}])  #插入多条数据
db.msg.insertMany([{'age':'18'},{'gender':'男'}])



二 . 删



# 删除库
use 想要删的库   # 先到要删的库下
db.dropDatabase()

# 删除表(集合)
use 要删除的表的所在库   # 先找到这个表
db.表名.drop()

# 如要删除msg库下的student表
user msg
db.student.drop()

# 删除表中数据
db.表名.deleteOne({条件})   # 删除符合条件的第一条数据
db.表名.deleteMany({条件})   #  删除符合条件的所有数据



三 . 改



db.表名.updataOne({'gender':'男'},{'$set':{'age':23}})   # 只修一条数据, 把最先录入的gender=男的age改成23,如果没有age,直接填上age=23
db.表名.updataMany({'gender':'男'},{'$set':{'age':23}})   # 修改所有数据.没有就新增.
# $set -> set修改器 起到强制覆盖替换的作用
array+object数据类型的修改方法,如course:[{'name':'python','score':100},{'name':'golang','score':99}]
# 把name=python的score改为50
db.表名.updataOne({'course.name':'python'},{$set:{'course.$.score':50}})
$ -> 意思就是取当前索引,由于array数据类型能自动遍历,所以能直接course.name

# 这里介绍一下修改器
$set    -> 强制替换覆盖
$unset  -> 强制删除字段
db.表名.updata({'age':28},{$unset:{'gende':1})  #直接把age=28的gender字段删掉,后面参数随便给.
$inc  -> 引用增加
# db.表名.updata({'name':'attila'},{$inc:{'age':1})   # 先引用在增加,在age=18的基础上加1,也就是age=19了

array操作:
$push 在array中追加,相当于append  
db.表名.update({name:"attila"},{$push:{hobby:"看书"}})
$pushAll  在array中追加列表中的所有元素,相当于extend
db.表名.update({name:"attila"},{$pushAll:{hobby:["篮球","足球","羽毛球"]}})
$pull  在array中删除一个元素,相当于remove
db.users.update({name:"attila"},{$pull: {hobby:"羽毛球"}})
$pullAll  在array中删除一堆元素
db.表名.update({name:"attila"},{$pullAll: {hobby:["篮球","足球"]}})
$pop
db.users.update({name:"attila"},{$pop: {hobby:1}})     # hobby后面写1或-1,1是删除最后一个,-1是删除第一个.



四 . 查



db.表名.find()     # 查询所有数据
db.表名.find({'age':18})  # 查询所有age=18的
db.表名.findOne({'name':'attila'})   # 查询一条

# 查询的关键字:
!!! array数据类型会自动遍历
$in  或者  
db.表名.find({age:{$in:[18,24]}})    # 查询age=18或者24的数据,必须是相同字段

$or  或者
db.表名.find({$or:[{age:18},{name:'attila'}]})  # 查询age=18或者name=attila的数据,可以跨字段

$all  子集查询
db.表名.find({hobby:{$all: ["篮球"]}})   #查询hobby里面有'篮球'的数据



  带有比较符的查询



$lt : 小于 
db.表名.find({age:{$lt:20}})   # 查询年龄小于20的数据
$lte: 小于等于 
$gt : 大于 
$gte: 大于等于 
$ne : 不等于



五 . sort(排序), skip(跳过), limit(选取条目)

    这三个的顺序是先排序, 在跳过, 最后筛选



# sort(排序)  参数为1或者-1
db.表名.find({}).sort({ age:1 })    # 参数为1,按照从小到大排序
db.users.find({}).sort({ age:1 , birthday:-1 })   # 先按age从小到大排序,如果age相等,按照birthday从大到小排序.
# skip(跳过)
db.表名.find({}).skip(1)   # 跳过一条数据

# limit(筛选)   参数写几查几条,超过最大条数按照最大条数拿
db.表名.find({}).limit(2)   # 拿出来两条数据,按照插入顺序拿

# 顺序,无论这三个谁先谁后,执行顺序都是先排序,在跳过,最后筛选
db.表名.find({}).limit(3).skip(2).sort({ age:-1 })

#  分页  如果每页显示10条数据,num=10,那么第1页就是就跳过0条数据,第二页就跳过第1页的10条数据
db.表名.find({}).limit(num).skip((page-1)*num)



六 . pymongo



# 首先要安装pymongo的第三方模块
from pymongo import MongoClient
from bson import ObjectId

MC = MongoClient('127.0.0.1',27017)
MONGODB = MC[库名]

# 增
res = MONGODB.表名.insert_one({"name":"attila"})  #  插入一条数据
print(res.insert_id)  #  拿到的是字符串类型的_id,如果需要以它为条件在mongodb中查询的话,需要用ObjectId强转一下,(见下面的查询)
MONGODB.表名.insert_many([{"name":"attila"},{"name":"萧峰"}])   # 插入多条数据
# 删
MONGODB.表名.delete_one({"age":18})   # 删除age=18的第一条数据
MONGODB.表名.delete_many({"gender":'男'})   #删除所有gender='男'的数据
# 改
MONGODB.表名.update_one({"name":"attila"},{"$set":{"age":18}})   # 把name=attila的第一条数据age改为18
MONGODB.表名.update_many({"gender":"男"},{"$set":{"age":50}})  # 把所有gender='男'的数据age改为50
# 查
res = MONGODB.表名.find_one({"_id":ObjectId("5cb6eb7322b9441020186701")})   #查询_id=后面一大串的数据, 
print(res.get('_id')   # 拿到的是ObjectId数据类型  
!!! ObjectId不能直接被json,如果想要json化,需要先转成str
MONGODB.表名.find_many({"gender":"男"})    # 查询所有gender='男'的数据
MONGODB.表名.find()   #  拿到的是生成器, 需要遍历才能拿到所有值