MongoDB增删改查
一 . 先说一下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() # 拿到的是生成器, 需要遍历才能拿到所有值