1:windos系统安装mongodb
- 安装教程
- 链接: lwindos安装教程.
2:什么是mongodb
- 1:是一个数据库;
- 2:是一个非关系型的数据库,文档数数据库
3:为什么学习mongodb
3.1:企业需求
- 要求爬虫开发工程师一定要会这个技术
3.2:爬虫需求
- 爬虫的数据如果上了一个星级,使用mongodb会比使用mysql好很多,主要是因为mysql的操作太过于麻烦了
- scrapy-redist:scrapy中的一个插件,但适用性差,并不是所有的公司都要去会使用分布式,所以这个可以不用重点学习
3.3:mongodb的特点
- 1:无数据结构方便做爬虫
- 2:高性能,具有非常高的读写性能
- 3:良好的支持,具有完善的文档,跨平台性良好,具有高的稳定性
4:mongodb的命令
- 主要介绍一些常用的命令
4.1:基本命令
展示数据库
show dbs
- 效果
清屏
cls
- 效果
使用数据库/创建数据库
use 要使用/要创建的数据库
- 效果
- 注意:这个时候创建的数据库还是创建在内存当中的,这个时候还是没有数据的,只有在硬盘中的数据才可以使用show dbs来查看
查看现在用的数据库
db
- 效果
查看当前使用数据库的集合(表)
show collections / show tables
- 效果
删除数据库
db.dropDatabase()
- 注意:
- 要跳转到这个数据库当中才可以删除数据库可以使用use命令跳转到需要删除的数据库
- 效果
4.2:插入数据
不手动创建表
- 注意:当没有这个表的时候 我们插入一条数据 这个表自动被创建出来了,当有这个表的时候,就会在这个表中插入数据
db.jerry.insert({x:1})
- 效果
手动创建表
db.createCollection('name', {capped:true, size:4})
-
参数解释:
- name: 表名
- capped:默认为False 不设置上限,True 就是有上限
- size:表示设置上限的大小,单位是字节,但是如果设置的容量大小小于256个字节,就默认是256个字节
-
注意:如果添加的数据超过了我们设置的上限,就会从开始覆盖数据
-
效果
-
注意:这个命令只是创建一个表而已,在表中没有任何的数据,要想插入数据还要使用插入命令
查看一个表/集合是否设置了上限
db.jerry1.isCapped()
- 注意
- jerry:表名;
- 返回值fales没有上限 ;true有上限
- 效果
在表中插入数据
db.jerry.insert({x:1})
- 效果
- 注意
- 插入的数据可以是重复的,但是可以通过id来分辨是不是为同一个数据
- 当没有这个表的时候,会先创建这个表,再插入数据,当有这个表的时候,会直接在这个表中插入数据
删除表/集合
db.jerry_collection.drop()
- 效果
插入多条数据
db.jerry2.insert([{name:'jerry',age:18,gender:'male'},{name:'juran'}])
- 注意:
- 记住要用到[]
- 每个不同的数据使用“,”分割
- 效果
使用循环插入多条数据(*)
- 带*的不要求掌握
for(i=3;i<10;i++)db.jerry3.insert({x:i})
- 效果
更新已经有的数据
- 更改已经有的数据
db.jerry3.save({_id:ObjectId("60d08f386bd683f7c417e0ac"),name:'jerry',gengder:'male'})
-
效果
-
注意:更新数据的“_id”一定要一样
-
插入新的数据
db.jerry3.save({name:'jerry',gender:'male'})
- 效果
- 注意:指定了id 然后就找到这条记录做更新,反之就插入
4.3:查询数据
查询所有数据
db.name.find()
- name:要查询的表/集合的名字
- 效果
格式化打印
db.stu.find().pretty()
- 效果
精确车查询
- 在db.name.find(),的括号中可以添加数据来实现精确查询
db.stu.find({name:'jerry'})
- 效果
格式化打印精确查询的数据
db.stu.find({name:'jerry'}).pretty()
- 效果
返回满足条件的第一条数据
- 1:无筛选条件的时候
db.stu.findone()
- 效果
- 2:有筛选条件的时候
db.stu.findOne({age:18})
- 效果
多条件查找
db.stu.find({age:18,homtown:'广州'})
- 效果
返回一个范围的数据
db.stu.find({age:{$gt:18}})
- 效果
- 运算符
- 等于:默认是等于判断,没有运算符
- 小于:$lt
- 小于等于:$lte
- 大于:$gt
- 大于等于:$gte
返回多条件的范围数据
db.stu.find({age:{$gt:18},hometown:'长沙'})
- 效果
或查询
- 语法:
- or:使用$or,值为数组,数组中每个元素为json,Mongodb默认为and
- db.jerry_collection.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gt:18}},{gender:false}]})
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
- 效果
自定义查询
db.stu.find({$where:function(){return this.age>18}})
- 查询年龄大于18,这个比较灵活,可以在函数中改变查询的条件
- 效果
范围查询
db.stu.find({age:{$in:[18,28]}})
- 返回年龄在18-28范围中的数据
- 效果
4.4:操作查询结果
返回查询结果的数量
- 1:无条件的查询
db.stu.find().count()
- 效果
- 2:有条件的查询
db.stu.find({age:18}).count()
- 效果
limit和skip
- 定义:
limit用于读取指定数量的前n个文档
db.stu.find().limit(n)
skip用于跳过指定数量n的文档
db.stu.skip(n)
limit和skip同时使用,先跳过两个返回的数据,在获取跳过数据的前两个数据
db.stu.find().skip(2).limit(2)
- 效果
映射
- 指定返回的字段,如果为1返回该字段
db.stu.find({},{age:1})
-
效果
-
注意
- 1:当要隐藏"_id"的时候,需要把"_id":0(映射为0)
- 2:可以有多个映射,每个映射之间用,分割
- 3:注意:在find()中的第一个空的花括号
排序
db.stu.find().sort({age:-1}) # 注意:age:1为升序,age:-1为降序
- 效果
- 注意:排序要是可以比较的元素
加条件的排序
db.stu.find({gender:true}).sort({age:-1})
- 效果
4.5:修改数据
更新数据
- 1:全部更新
- 正常的更新,但是后面的数据不会保留
db.集合名称.update({query}, {update}, {multi: boolean})
- 参数名称
- 参数query:查询条件
- 参数update:更新操作符
- 参数multi:可选,默认是false,表示只更新找到的第一条数据,值为true表示把满足条件的数据全部更新
- 效果
- 部分更新
- 指定键值的更新 保留后面的数据
db.stu.update({nmae:'张三'},{$set:{name:'李四'}})
- 效果
- 更新全部的数据
db.stu.update({},{$set:{gender:0}},{multi:true})
- 效果
删除数据
- 1:删除符合条件的第一个数据
db.stu.remove({age:18},{justOne:true})
- 效果
- 2:删除前两个数据
db.stu.remove({age:18},{justTwo:true})
- 效果
- 另:别的删除也没有试过,可以试一下
- 3:删除表中的所有数据
db.stu.remove({})
- 效果
- 4:删除表
db.stu.drop()
- 效果
5:题目
测试数据
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,
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
-
答案:
db.persons.find({age:{$gt25,$lt27}},{name:1,age:1})
-
效果
-
2.查询出不是美国的name
-
答案:``````
-
效果
-
3.查询国籍是中国或者美国的学生信息
-
答案:
db.persons.find({$or:[{country:'USA'},{country:'China'}]})
-
效果
-
4.查询语文成绩大于85或者英语成绩大于90的学生信息
-
答案:
db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]})
-
效果
-
5.查询出名字中存在"li"的学生信息
-
答案:
db.persons.find({name:/li/},{name:1})
-
效果
-
6.查询喜欢看MONGODB和PHP的学生
-
答案:
db.persons.find({books:{$all:['MONGODB','PHP']}},{books:1})
-
效果
-
7.查询第二本书是JAVA的学生信息
-
答案:
db.persons.find({'books.1':'JAVA'},{books:1})
-
效果
-
8.查询喜欢的书数量是4本的学生
-
答案:
db.persons.find({books:{$size:4}},{books:1})
-
效果
-
9.查询出persons中的国家分别是什么
-
答案:
db.persons.distinct('country')
-
效果