NoSQl
- not only sql–非关系型数据库
- 优点:高可扩展性,分布式计算,低成本,架构的灵活性半结构数据化,没有复杂的关系
- 缺点: 没有标准化,有限的查询功能,最终一致是不直观的程序
MongoDB
- 特点:
- 模式自由:可以把不同结构的文档存储在同一个数据库里
- 面向集合的存储:适合存储json风格的文件形式
- 数据结构由键值对组成,类似json对象,字段值可以包括其他文档/数组/文档数组
- 查询mogodb服务器状态:ps -ajx | grep mongod /sudo systemctl status mongod
- 关闭:sudo service mongod stop
- 启动:sudo service mongod start
- 进入MongoDB:mongo
- 显示所有的数据库:show databases/dbs
- 选择数据库: use name
- 查看选择的那个数据库:db
- 显示集合:show collections
- 查看集合的数据:db.集合名.find({})
- 创建新的数据库:use name
- 删除:db.dropDatabase()
- 创建新的集合:db.createCollection(“students”)
- 查看当前所有集合:show tables
- 删除集合:db.students.drop()
- object id:• 每个文档都有一个属性,为_id,保证每个文档的唯一性
增删改查
- 插入:db.集合名称.insert({数据})
- db.students.insert({“name”:”wukong”,gender:0})
- key可以不加引号,value需要加引号
- db.students.insert({“name”:”wukong”,gender:0})
- 查看数据:db.集合名称.find()/db.集合名称.find({})
- 比较运算符:
- • 等于,默认是等于判断,没有运算符
- • 小于$lt
- • 小于或等于$lte
- • 大于$gt
- • 大于或等于$gte
- • 不等于$ne
- 查询标题等于”sql”的学科:db.sub.find({title:’sql’})
- 查找标题不是mongo的:db.sub.find({title:{$ne:’mongodb’}})
- 逻辑运算符:
- 逻辑与:逗号连接
- 逻辑或:$or
- 查询课时大于或等于10,并且标题为web的学科db.sub.find({count:{$gte:10},title:”web”})
- 查询课时大于10,或标题为web的学科db.sub.find({or:[{count:{ or:[{count:{ gt:10}},{title:’web’}]})
- 范围运算符–”$in”
- 查询课时为8、14的学科db.sub.find({count:{$in:[8,14]}})
- • 方法limit():用于读取指定数量的文档
- 查询2条学生信息db.stu.find().limit(2)
- • 方法skip():用于跳过指定数量的文档
- 查询从第3条开始的学生信息db.stu.find().skip(2)
- 比较运算符:
更新数据:
db.集合名称.update(,
,
{
upsert: <boolean>, multi: <boolean>
}
)- 参数:
- • 参数query:查询条件,类似sql语句update中where部分
- • 参数update:更新操作符,类似sql语句update中set部分
- • 参数upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- • 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
- db.stu.update({name:”abc”},{name:’mnc’})修改数据,会破坏原有的结构
- db.stu.update({name:”abc”},{$set:{name:’mnc’}}) 不会破坏原有结构
- db.stu.update({},{$set:{name:’mnc’}},{multi:true}) 修改多条数据
- 参数:
- save
- 使用save()函数,如果原来的对象不存在,那他们都可以向collection里插入数据,如果已经存在,save会调用update更新里面的记录,而insert则会忽略操作,并且提示报错。
- insert可以一次性插入一个列表,而不用遍历,效率高,save则需要遍历列表,一个个插入。
- 删除:
db.集合名称.remove(
,
{
justOne:
}
)
- • 参数query:可选,删除的文档的条件
- • 参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
-
- db.stu.remove({gender:0},{justOne:true})只删除一条
- db.stu.remove({}) 全部删除
- max
- db.createCollection(‘sub’,{capped:true,size:5,max:3})创建一个名为sub的定长集合,长度为5个字节,可容纳的文档数为3
- 在robomongo工具中和pymongo模块中:
capped:封顶,结合size,max:3就是当第3条数据时,再插入数据覆盖之前插入的第1条数据给覆盖了,也就是说最多数据不能超过3条,也就是说数据只能存放3条。
与Python交互:
- 引入pymongo包
- from pymongo import MongoClient
- 链接,创建客户端:
- 无安全认证:
- client = MongoClient(‘localhost’, 27017)
- client=MongoClient(‘mongodb://localhost:27017/数据库名称’)
- client=MongoClient(‘mongodb://localhost:27017/test1’)
- 有安全认证:
- client=MongoClient(‘mongodb://用户名:密码@localhost:27017/数据库名称’)
- 无安全认证:
- 获取数据库: db=client.数据库名/db=dlient[‘数据库名’]
- 获取集合:t1=db.集合名/ db.[‘集合名’]
基本操作
- 添加一个文档:s=t1.insert_one({“key”:”value”})
- 修改文档:s=t1.update_one({“name”:”郭靖”},{“$set”:{“name”:”黄蓉”}})
- 删除一个文档:s1 = t1.delete_one({‘name’:’黄药师’})
- 删除多个:s1 = t1.delete_many({‘name’:’黄药师’})
查询
- 查询一个:s1 = t1.find_one({‘name’:’黄蓉’})
- 查询多个:
s1 = t1.find() print(s1) for cur in s1: print(cur) s1 = t1.find() print(s1.next()) print(s1.next())
- #查询年龄大于18的所以数据:cursor = t1.find({“age”:{“$gt”:18}})
- 用代码创建数据库test2里面创建集合t2
- test2 = client[‘test2’]
- t2 = test2.t2
- s = t2.insert({“name”:”悟空”})