mongodb的介绍
数据库一般分为关系型数据库如:MySQL,和非关系型数据库如:mongodb。关系型数据库中存储的是大量的表,结构严谨,表中每条数据字段相同;而非关系型数据库中是以集合的形式存储的,数据是一个一个的键值对,无序,每个键值对独立存在,键值对之间可以有不一样的字段。
关于nosql的介绍摘抄自课堂笔记:
“NoSQL”⼀词最早于1998年被⽤于⼀个轻量级的关系数据库的名字
随着web2.0的快速发展, NoSQL概念在2009年被提了出来
NoSQL在2010年⻛⽣⽔起, 现在国内外众多⼤⼩⽹站, 如facebook、 google、 淘宝、 京东、 百度等, 都在使⽤nosql开发⾼性能的产品
对于⼀名程序员来讲, 使⽤nosql已经成为⼀条必备技能
NoSQL最常⻅的解释是“non-relational”, “Not Only SQL”也被很多⼈接受, 指的是⾮关系型的数据库
大数据下mongodb的优势
通常使用的关系型数据库,如mysql,功能很强大,但是在大数据下,略显不足。因为关系型数据库在更改表结构时,是一件很难完成的事情,比如一张结构完备的表已经存储了上亿条数据,此时要给这张表添加一个字段,那么上亿条数据每条数据都要重新填写一遍新字段的字段内容,压力很大。应运而生的非关系型数据库,便具有易扩展,大数据高性能的优势。
优势摘抄自课堂笔记:
易扩展: NoSQL数据库种类繁多, 但是⼀个共同的特点都是去掉关系数据库的关系型特性。 数据之间⽆关系, 这样就⾮常容易扩展
⼤数据量, ⾼性能: NoSQL数据库都具有⾮常⾼的读写性能, 尤其在⼤数据量下, 同样表现优秀。 这得益于它的⽆关系性, 数据库的结构简单
灵活的数据模型: NoSQL⽆需事先为要存储的数据建⽴字段, 随时可以存储⾃定义的数据格式。 ⽽在关系数据库⾥, 增删字段是⼀件⾮常麻烦的事情。 如果是⾮常⼤数据量的表, 增加字段简直就是⼀个噩梦
mongodb的安装
下载地址:(下载zip文件)
解压至指定文件夹,可以自己命名,不建议使用中文,如:Mongo。
在data文件夹中创建db和log文件夹,用于存放数据和log日志。
在Mongo文件夹下创建mongo.config文件。
打开cmd,将路径跳转到Mongo的bin目录下,执行命令:
mongod --dbpath C:\Mongo\data\db
不要关闭cmd
在浏览器输入:127.0.0.1:27017
此时返回刚才创建的mongo.config文件中添加db和log的路径,如:
dbpath = C:\Mongo\data\db(就是自己安装的路径)
logpath = C:\Mongo\data\log\mongo.log
以管理员身份运行cmd,跳转到mongo的bin文件夹下,使用命令:
mongod --config C:\Mongo\mongo.config --install --serviceName “MongoDB”
将bin文件夹的路径添加到系统环境变量中,以保证可以再cmd中操作mongo。
完成后重新打开cmd命令行,输入mongo,如果可以正常运行表示安装成功。
mongodb的基本操作
打开cmd命令行,输入mongo,启动终端。
1.查看所有数据库,使用命令:
show dbs
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
2.查看当前使用数据库,使用命令:
db
> db
test
# 可以看到mongo默认使用的是test数据库,但是在查看所有数据库中并没有显示这个数据库,这是因为test练习数据库中并没有任何的数据,当添加数据后,就是正常显示。
3.更改当前使用的数据库,使用命令:
use + db_name
> use admin
switched to db admin
# 这里值得一提的是,在更还数据库时一定要保证输入正确,因为mongo数据库有一个特点,该数据库存在,则执行更改数据库命令,该数据库不存在,则直接创建该命名的数据库。
4.删除当前数据库,使用命令
db.dropDatabase()
> use a1704
switched to db a1704
> db.dropDatabase()
{ "ok" : 1 }
# 这里值得一提的是,mongo数据库命令有自动补全功能,例如输入db.drop按下tab键,将自动补全后续命令
# 连击tab键则会显示该语句下的所有补全语句(属于help)
5.手动创建集合(MYSQL中的表),使用命令:
db.createCollection(‘a1704’,{capped:true,size:10})
> db.createCollection('a1704',{capped:true,size:10})
{ "ok" : 1 }
# 这里的capped参数表示是否为集合设置上限,true表示设置,后跟的size表示最大上限的长度,若集合有上限
# 在当数据量达到上限时,新入库的数据将会依次覆盖前边的数据。
6.向集合中添加数据,使用命令:
db.db_name.insert({键值对数据})
> db.a1704a.insert({'name':'张三','age':18})
WriteResult({ "nInserted" : 1 })
# 这里值得一提的是,集合名称,如果存在,则添加数据,如果不存在,则自动创建集合,再添加数据。
# 所有在应用中,可以无需创建集合再添加数据,可以直接向没有创建的集合中添加数据。
# 插入数据展示
{ "_id" : ObjectId("5d0ef4ec8f5192d41fe44845"), "name" : "张三", "age" : 18 }
# 可以看出,系统自动为这条数据添加了一个_id字段,用于表示数据的唯一性。该字段的组成:
长度为12字节的十六进制数:一个字节占两个位数
前四个:为当前时间戳
再三个:机器ID
再两个:服务进程ID
最后三个:简单的增量
# 若用户没有手动添加,则系统默认添加,若手动添加,则系统不加。_id不可重复。
7.数据的保存与修改,使用命令:
db.db_name.save({键值对数据})
> db.a1704a.save({'name':'李四','age':19})
WriteResult({ "nInserted" : 1 })
> db.a1704a.find()
{ "_id" : ObjectId("5d0ef4ec8f5192d41fe44845"), "name" : "张三", "age" : 18 }
{ "_id" : ObjectId("5d0ef7c58f5192d41fe44846"), "name" : "李四", "age" : 19 }
没有相同的ID为插入功能
储存相同的ID为修改功能
mongodb的数据查询
1.集合的简单查询,使用命令:
db.集合名.find()
> db.a1704a.find()
{ "_id" : ObjectId("5d0ef4ec8f5192d41fe44845"), "name" : "张三", "age" : 18 }
{ "_id" : ObjectId("5d0ef7c58f5192d41fe44846"), "name" : "李四", "age" : 19 }
2.集合的按条件查询,使用命令:
db.集合名.find(’{查询条件}’)
> db.a1704a.find({'age':18})
{ "_id" : ObjectId("5d0ef4ec8f5192d41fe44845"), "name" : "张三", "age" : 18 }
# 查找年龄为18的数据,也可以多个条件一起写,很灵活
3.集合中数据的更新,使用命令:
db.colle_name.update({查询条件},{修改内容},{multi:boolean})
"multi update only works with $ operators
> db.a1704a.update({'age':18},{'age':55})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.a1704a.find()
{ "_id" : ObjectId("5d0ef4ec8f5192d41fe44845"), "age" : 55 }
{ "_id" : ObjectId("5d0ef7c58f5192d41fe44846"), "name" : "李四", "age" : 19 }
# 可以看到在数据更改以后,并不是更改了一条数据的一个字段,而是将整条数据都修改了了,那么要修改一条数据中的一个字段需要使用:
> db.a1704a.update({'age':18},{$set:{'age':55}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.a1704a.find()
{ "_id" : ObjectId("5d0ef4ec8f5192d41fe44845"), "age" : 55, "name" : "张三" }
{ "_id" : ObjectId("5d0ef7c58f5192d41fe44846"), "name" : "李四", "age" : 19 }
# 需要使用{$set:{需要修改的字段}}的形式
4.集合中数据的删除,使用命令:
db.集合名称.remove(<查询条件>,{justOne: boolean})
> db.a1704a.remove({'age':55},{justOne:true})
WriteResult({ "nRemoved" : 1 })
> db.a1704a.find()
{ "_id" : ObjectId("5d0ef7c58f5192d41fe44846"), "name" : "李四", "age" : 19 }
# 默认删除全部符合查询条件的数据,如果只需要删除一条,则需要加入参数justOne,值为true或1
5.集合中查找数据使用的比较运算符:
比较运算符:
lt:小于
gt:大于
lte:小于等于
gte:大于等于
db.a1704a.find({'age':{$lt:20}})
表示寻找数据中年龄小于20岁所有数据
db.db_name.find( {$or:[{'name':'张三'},{'age':{$gte:30}}]} )
列表中可以填写多个查询条件,$or表示或,$and表示与
6.范围运算符:
使⽤"$in", "$nin" 判断是否在某个范围内
查询年龄为18、 28的学⽣
db.stu.find({age:{$in:[18,28]}})
7.集合查询支持正则表达式:
使⽤//或$regex编写正则表达式
查询姓⻩的学⽣
db.stu.find({name:/^⻩/})
db.stu.find({name:{$regex:'^⻩'}})
# 表示查询集合的name字段中以‘黄’开头的都符合查询
8.集合数据的排序:
# 本身集合中的键值对数据是没有顺序的,但是可以按照某一字段使用sort()对其进行排序:
db.集合名称.find().sort({字段:1,...})
# 1表示按照升序排序
# -1表示按照降序排序
# 排序字段可以有多个
# 表示先按照某个字段排序,当该字段相同时,再按照下一个字段排序
9.集合数据个数统计
⽅法count()⽤于统计结果集中⽂档条数
db.集合名称.find({条件}).count()
db.集合名称.count({条件})
db.stu.find({gender:true}).count()
db.stu.count({age:{$gt:20},gender:true})
10去除集合中的重复字段:
⽅法distinct()对数据进⾏去重
db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('hometown',{age:{$gt:18}})
mongodb和Python交互
安装pymongo使用命令:
pip install pymongo
交互
from pymongo import MongoClient
# 和数据库主机获得链接
conn = MongoClient('127.0.0.1',27017)
# 链接到具体的数据库
db = conn['c4a']
# 链接到数据库中具体的集合
coll = db['c4a']
# 获取集合中具体的数据 查询一条
data = coll.find_one({'name':'张三'})
print(data)
print(type(data))
# 修改该数据的字段
data['age'] = 38
# 保存修改
coll.save(data)
# 查询所有符合的数据集
data = coll.find({'name':'zhansan'})
print(type(data))
for i in data:
print(i)