一、介绍

  • 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.比较运算符

等于:默认是等于判断,没有运算符
⼩于:mongodb 的库结构 mongodb数据库_mongodblte
⼤于:mongodb 的库结构 mongodb数据库_mongodb_02gte

查询y⼤于等于18的数据
db.jerryn_collection.find({y:{$gte:18}})

6.范围运算符
  • 使⽤mongodb 的库结构 mongodb数据库_mongodb_03nin判断是否在某个范围内查询年龄为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