一、介绍
- MongoDB是⼀个基于分布式⽂件存储的nosql数据库。在处理⼤数据的时候会 ⽐MySQL更有优势。爬⾍的数据如果上了⼀个量级,可能⽤MongoDB会⽐ MySQL更好
二、SQL和NoSQL的主要区别
- 在SQL中层级关系:数据库->表->数据
- 在NoSQL中是:数据库->集合->⽂档
MongoDB的优势
(一)⽆数据结构限制
- 没有表结构的概念,每条记录可以有完全不同的结构 业务开发⽅便快捷
{name:'⼩明',sex:'男'}
{name:'jerry',address:'东北'}
{name:'⼩红',home:[{'⼭东'},{江⻄}]}
(二) 大数据量和高性能
- nosql数据库都具有⾮常⾼的读写性能,尤其在⼤数量下表现优秀
(三) 良好的⽀持
- 完善的⽂档
- ⻬全的驱动⽀持
三、MongoDB在Ubuntu中安装
(一) 在Linux中安装MongoDB
- sudo apt-get install mongodb
(二) 开启服务
- sudo service mongodb start
(三) 关闭服务
- sudo service mongodb stop
(四) 重启服务
- sudo service mongodb restart
注意:如果是系统⾮正常关闭,这样启动会报错,由于mongodb⾃动被锁上了,这是需要进⼊mongodb数据库⽂件所在的⽬录(/var/lib/mongodb/),删除⽬录中的mongodb.lock⽂件,然后再进⾏上述操作。
(五) 如果想让远程连接
需要修改 /etc/mongodb.conf
打开⽂件: sudo vim /etc/mongodb.conf
注释掉 bind 127.0.0.1
四、MongoDB在Windows中安装
- ⽹址:https://www.mongodb.com/download-center/community
- Windows安装MongoDB:
*
五、mongodb的操作
(一)运行mongodb
- 1.把mongodb的bin目录加入到环境变量中
- 2.执行命令
。mongod --dbpath D:\MongoDB\data # 启动
(二) 连接MongoDB
- 在环境变量设置好的前提下,使⽤以下命令 mongo 就可以进⼊到mongo的操作终 端了
- 查看帮助命令
- python mongo -help
六、mongodb介绍
(一) mongodb概念介绍
(二) MongoDB三元素
- 三元素:数据库、集合、⽂档
- 1.⽂档:就是关系型数据库中的⼀⾏。⽂档是⼀个对象,由键值对构成,是json的 扩展形式
- python {“name”: “abc”, “gender”: 1}
- 2.集合:就是关系型数据库中的表。可以存储多个⽂档,结构可以不固定。
- {“name”: “abc”, “gender”: 1}
- {“name”: “abc”, “age”: 18}
- {“title”: “abc”, “price”: 1}
七、mongoDB中数据库的基本使⽤
- 查看数据库
。show dbs - 切换数据库
。use 数据库 - 查看当前的数据库
。db - 删除数据库
。db.dropDatabase() - 会⾃动创建数据库
。use 数据库 - 查看集合
。show tables/show collections
八、MongoDB中集合的基础命令
- 不⼿动创建集合,向不存在的集合中第⼀次加⼊数据时,集合会被创建出 来
(一).⼿动创建集合 : db.createCollection(name,options)
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存⼤⼩及索引的选项
db.createCollection('sub',{capped:true,size:10})
- 参数capped:默认值为false表示不设置上限,值为true表示设置上限
- 参数size:当capped值为true时,需要制定此参数。表示上限⼤⼩,当⽂档达 到上限时,会将之前的数据覆盖,单位为字节
(二).查看集合
show collections
- 删除集合:db.集合名称.drop()
九.MongoDB的数据类型
- String:字符串,必须是有效的UTF-8
- Boolean:存储⼀个布尔值,true或者false
- Integer:整数可以是32位或64位,这取决于服务器
- Double:存储浮点数
- Arrays:数组或列表
- Object:嵌⼊式⽂档 Null:存储Null值
- Timestamp:时间戳, 表示从1970-1-1到现在的总秒数
- Object ID是⼀个12字节的⼗六进制数
十.数据库命名规范
1.不能是空字符串
2.不得含有特殊字符
3.应全部⼩写
4.最多64个字节
5.数据库名不能与现有系统保留库同名,如admin,local
十一.MongoDB的增删改查
- mongoDB中⼀张表称为⼀个集合
(一).mongoDB插⼊数据
db.集合名.insert({}) 数据格式为json,id不能重复,⽀持多条插⼊数据库
1.单条插⼊数据
db.jerry_collection.insert({x:1})
2.多条数据插入
for(i=3;i<10;i++)db.jerry_collection.insert({x:i})
十二、mongodb的保存
- 命令:
db.集合名称.save(document)
db.stu.save({_id:ObjectId("5f169b37d74866264ed9a7db"), name:'gj', gender:2})
db.stu.save({name:'gj', gender:2})
db.stu.find()
十三、MongoDB查询数据
(一)、测试数据
db.stu.insert([{"name":"张三","hometown":"⻓沙","age":20, "g106ender":true},
{"name":"⽼李","hometown":"⼴州","age":18,"gender" : false },
{"name":"王麻⼦","hometown":"北京","age":18, "gender":false},
{"name":"刘六","hometown":"深圳","age":40,"gender" :true},
{"name":"jerry","hometown":"⻓沙","age":16,"gender":true},
{"name":"⼩永","hometown":"⼴州","age":45,"gender":true} ,
{"name":"⽼amy","hometown":"衡阳","age":18, "gender":true}])
1.查询所有数据
db.jerry_collection.find({条件⽂档})
2.⽅法pretty():将结果格式化
db.集合名称.find({条件⽂档}).pretty()
3.查询单条数据
db.jerry_collection.findOne({条件⽂档})
4.带有条件的查询
查询x等于100的数据
db.jerry_collection.find({x:100})
查询x等于100,y等于99的 5
db.jerry_collection.find({x:100,y:99})
5.比较运算符
等于:默认是等于判断,没有运算符
⼩于:lte
⼤于:gte查询y⼤于等于18的数据
db.jerryn_collection.find({y:{$gte:18}})
6.范围运算符
- 使⽤nin判断是否在某个范围内查询年龄为18、28的学⽣
- db.jerry_collection.find({age:{$in:[18,28]}})
7.逻辑运算符
- or:使⽤$or,值为数组,数组中每个元素为json
- db.jerry_collection.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gt:18}},{gender:false}]})
8.⾃定义查询
mongo shell 是⼀个js的执⾏环境
使⽤$where 写⼀个函数, 返回满⾜条件的数据
查询年龄⼤于30的学⽣
db.jerry_collection.find({
$where:function() { 4 return this.age>30;}
}
十四、查询结果操作
(一).查出数据总和
db.jerry_collection.find().count()
(二).limit和skip
limit⽤于读取指定数量的⽂档
db.jerryn_collection.find().limit(2)
skip⽤于跳过指定数量的⽂档
db.jerry_collection.find().skip(2)
limit和skip同时使⽤
db.jerry_collection.find().skip(2).limit(2)
(三).映射
指定返回的字段,如果为1则返回改字段,如果为0则除了改字段外所有字段返 回。id如果没写会默认返回
db.jerry_collection.find({},{_id:1})
(四).排序
按照年龄升序排序
db.jerry_collection().find().sort({age:1})
按照年龄降序排序
db.jerry_collection().find().sort({age:-1})
(五).修改数据
db.集合名称.update({query}, {update}, {multi: boolean})
- 参数query:查询条件
- 参数update:更新操作符
- 参数multi:可选,默认是false,表示只更新找到的第⼀条数据,值为true表 示把满⾜条件的数据全部更新
db.jerry_collection.insert({x:100,y:100,z:100})
{ "_id" : ObjectId("59b297dd8fa0c171faae5bc8"), "x" : 100, "y" : 100, "z" : 100 }
db.jerry_collection.update({x:100},{y:99})
修改后数据变为
{ "_id" : ObjectId("59b297dd8fa0c171faae5bc8"), "y" : 99 }
部分更新
db.jerry_collection.update({x:100},{$set:{y:99}})
如果y:100数据不存在,就插⼊y:101这条数据,第三个参数为true
db.jerry_collection.update({y:100},{y:101},true)
更新多条
db.jerry_collection.update({y:99},{$set:{y:101}},{multi:true})
(六).删除数据
db.jerry_collection.remove({条件},{justOne:true}) mongoDB为了防⽌误 删除,条件必须写
db.jerry_collection.remove() 删除所有数据,索引不会删除
db.jerry_collection.remove({x:100})
(七).删除表
db.jerry_collection.drop()
练习
- 测试代码
var persons = [{
name:"jim",
age:25,
email:"75431457@qq.com",
c:89,m:96,e:87,
country:"USA",
books:["JS","C++","EXTJS","MONGODB"]
},
{
name:"tom",
age:25,
email:"214557457@qq.com",
c:75,m:66,e:97,
country:"USA",
books:["PHP","JAVA","EXTJS","C++"]
},
{
name:"lili",
age:26,
email:"344521457@qq.com",
c:75,m:63,e:97,
country:"USA",
books:["JS","JAVA","C#","MONGODB"]
},
{
name:"zhangsan",
age:27,
email:"2145567457@qq.com",
c:89,m:86,e:67,
country:"China",
books:["JS","JAVA","EXTJS","MONGODB"]
},
{
name:"lisi",
age:26,
email:"274521457@qq.com",
c:53,m:96,e:83,
country:"China",
books:["JS","C#","PHP","MONGODB"]
},
{
name:"wangwu",
age:27,
email:"65621457@qq.com",
c:45,m:65,e:99,
country:"China",
books:["JS","JAVA","C++","MONGODB"]
},
{
name:"zhaoliu",
age:27,
email:"214521457@qq.com",
c:99,m:96,e:97,
country:"China",
books:["JS","JAVA","EXTJS","PHP"]
},
{
name:"piaoyingjun",
age:26,
email:"piaoyingjun@uspcat.com",
c:39,m:54,e:53, 63 country:"Korea",
books:["JS","C#","EXTJS","MONGODB"]
},
{
name:"lizhenxian",
age:27,
email:"lizhenxian@uspcat.com",
c:35,m:56,e:47,
country:"Korea",
books:["JS","JAVA","EXTJS","MONGODB"]
},
{
name:"lixiaoli",
age:21,
email:"lixiaoli@uspcat.com",
c:36,m:86,e:32,
country:"Korea",
books:["JS","JAVA","PHP","MONGODB"]
},
{
name:"zhangsuying",
age:22,
email:"zhangsuying@uspcat.com",
c:45,m:63,e:77,
country:"Korea",
books:["JS","JAVA","C#","MONGODB"]
}]
for(var i = 0;i<persons.length;i++){
db.persons.insert(persons[i])
}
var persons = db.persons.find({name:"jim"})
while(persons.hasNext()){
obj = persons.next();
print(obj.books.length)
}
题⽬
- 1.查询年龄⼤于25⼩于27的name,age
- 2.查询出不是美国的name
- 3.查询国籍是中国或者美国的学⽣信息
- 4.查询语⽂成绩⼤于85或者英语成绩⼤于90的学⽣信息
- 5.查询出名字中存在"li"的学⽣信息
- 6.查询喜欢看MONGODB和PHP的学⽣
- 7.查询第⼆本书是JAVA的学⽣信息
- 8.查询喜欢的书数量是4本的学⽣
- 复习
- 操作
mongodb的基本命令
show dbs #查看当前的数据库
use admin #使用admin数据库
db #查看当前的数据库
use demo #如果没有demo数据库,它就会自动创建demo数据库(必须在存入数据的情况下)
show collections #查看数据库当中的表
show tables #查看当前数据库当中的表
db.dropDatabase() #删除数据库
cls #清空当前页面mongodb的集合命令 在mongodb中建表 手动建表 不手动建表 db.jerry.insert({x:1})
#给当前选中数据库插入一个数据1 x为键值(不手动创建) db.createCollection(name,options)#手动创建一个集合 name:集合的名称 options:可选参数
有关内存的大小 不设置这个参数,默认为False没有上限 设置为True就是有上限 db.jerry.find() #查找所有
查看jerry内所有的元素 db.createCollection(“jerry1”,{capped:true,size:4})
#capped:true,size:4 capped:true进行限制 size:限制大小,代表字节,小于256 默认256 db.jerry.isCapped() #判断jerry这张表有没有上限 false没有 true有
db.jerry_collection.drop()#删除一个表名为jerry_collection的表
ObjectId(“604b15eae1fe98ce5ed26f66”) #里面的数据是唯一的,自动生成的mongodb的插入数据 db.集合名.insert({}) db.jerry.insert({x:1})#给当前选中数据库插入一个数据1
x为键值(不手动创建) db.jerry3.insert({name:“jerry”,age:18,gender:‘male’})
#给当前数据库中插入多条数据 name’jerry’ age:18,gender:‘meal’ db.jerry3.insert({name:“jerry”,age:18,gender:‘male’,_id:1})#_id的值会改变为1
db.jerry3.insert([{name:“jerry”,age:18,gender:‘male’},{name:“abc”}])
#插入多条数据 db.jerry.save({_id:ObjectId(“604b15eae1fe98ce5ed26f66”),name:18,gender:‘male’})#将jerry表中_id:ObjectId(“604b15eae1fe98ce5ed26f66”)的数据进行更新
会覆盖前面的数据,没有id就相当于插入了一条数据mongodb查询 db.stu.find({name:‘jerry’})#在当前数据库stu表中查询一个name为jerry的信息
db.stu.find({name:‘jerry’}).pretty() #格式化的查询
db.stu.findOne()#查询当前数据库stu表的第一条数据
db.stu.find({age:18})#查询当前数据库stu表中年龄为18的人
db.stu.find({age:18,name=‘老amy’})#查询当前数据库stu表中年龄为18 name为老amy的人
db.stu.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:18}̲}) #查询当前数据库中stu…gte:18}})#查询当前数据库中stu表中年龄大于等于18
db.stu.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 7: gte:18}̲,hometown:'长沙'}…or:[{age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:18}̲},{gender:false…in:[18,20]}})#查询年龄在18到20的人
db.stu.find({age:{$in:[18,20]}}).count()#查询年龄在18到20的人的数量
db.stu.find().limit(2) #读取两个数据 db.stu.find({},{age:1})#只返回age字段
db.stu.find({},{age:1,_id:0})#只返回age字段,不要主key