MongoDB上
- 1. MongoDB入门
- 1.1 基本概念
- 1.2 下载与安装
- 1.3 运行MongDB
- 1.4 MongoDB数据库的基本使用
- 3. mongodb的数据操作
- 3.1 插入数据
- 3.2 更新(保存)数据:
- 3.3 查询数据
- 3.4 操作查询结果
1. MongoDB入门
1.1 基本概念
MongoDB是⼀个基于分布式文件存储的nosql数据库,非关系型的数据库保存数据的类型非常的灵活。在处理大数据的时候会比MySQL更有优势。爬虫的数据如果上了⼀个量级,可能用MongoDB会比MySQL更好。
优势:
- 无数据结构的限制,业务开发非常快捷;
- 大数据量和高性能;
- 良好的支持:完善的文档+齐全的驱动支持。
1.2 下载与安装
官网链接:https://www.mongodb.com/download-center/community
下载完安装包(msi文件),双加打开按步骤安装:
安装完成后,要将bin文件的目录添加到path环境变量中,如下图:
1.3 运行MongDB
启动服务:
> mongod -- dbpath C:\Program Files\MongoDB\Server\4.4\data
链接服务:
mongo
在环境变量设置好的前提下,就可以进入终端进行一些操作,比如查看帮助命令:
> mongo -help
1.4 MongoDB数据库的基本使用
元素概念:
SQL概念 | MongoDB概念 | 解释 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 字段/域 |
index | index | 索引 |
primary key | primary key | 主键 |
三元素:数据库、集合、文档
- 文档:就是关系型数据库中的一行。文档是⼀个对象,由键值对构成,是json的扩展形式;
{"name": "abc", "gender": 1}
- 集合:就是关系型数据库中的表,可以存储多个文档,结构可以不固定。
{"name": "abc", "gender": 1}
{"name": "abc", "age": 18}
{"title": "abc", "price": 1}
数据类型:
- String:字符串,必须是有效的UTF-8
- Boolean:存储⼀个布尔值,true或者false
- Integer:整数可以是32位或64位,这取决于服务器
- Double:存储浮点数
- Arrays:数组或列表
- Object:嵌入式文档
- Null:存储Null值
- Timestamp:时间戳,表示从1970-1-1到现在的总秒数
- Object ID:⼀个12字节的十六进制数
基本命令:
> show dbs # 查看数据库 第一次安装 会有3个它自带的数据库
admin 0.000GB
config 0.000GB
local 0.000GB
> use admin # 选择使用哪个数据库
switched to db admin
> db # 查看当前所使用的数据库
admin
> db.dropDatabase() # 删除数据库
{ "ok" : 1 }
> use mydata
switched to db mydata
数据库的命名规范:
- 不能是空的字符串;
- 不能含有特殊字符;
- 应该全部小写;
- 不能和系统保留的数据库重名;
- 最多64个字节。
在数据库中创建集合:
在mongo中建表分为手动和不手动。
不手动创建集合,向不存在的集合中第⼀次加入数据时,集合会被创建出来。
插入数据命令:db.集合名.insert({})
> db.test.insert({x:1}) # 插入数据
WriteResult({ "nInserted" : 1 })
> show tables # 该命令和show collectios效果一样
test
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
mydata 0.000GB
上述操作,笔者在"mydata"数据库中通过插入数据创建一个集合。
手动创建集合:db.createCollection(name,options)
name:集合的名称;
options:可选参数,指定有关内存大小及索引的选项。
> db.createCollection('test2',{capped:true,size:4})
{ "ok" : 1 }
> show tables
test
test2
参数capped:默认值为false表示不设置上限,值为true表示设置上限;
参数size:当capped值为true时,需要制定此参数。表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节;
在mongo中如果你的size(代表字节)小于256,默认就是256。
查找集合数据:db.集合名.find()
> db.test2.insert({name:'jerry'})
WriteResult({ "nInserted" : 1 })
> db.test2.find()
{ "_id" : ObjectId("6051c54a236fc1ddda5f663f"), "name" : "jerry" }
注意:ObjectId("6048be036e2d0e8af3a54b35")
是数据唯一的ID,而且它是自动生成的。
判断一个集合是否设置了上限:db.集合名.isCapped()
,返回的是false就是没有设置 true就是设置了。
> db.test2.isCapped()
true
> db.admin.isCapped()
false
删除集合:db.集合名.drop()
> db.test2.drop()
true
> show tables
test
3. mongodb的数据操作
3.1 插入数据
数据格式为json,id不能重复,支持多条插入数据库。
插入单条数据:db.集合名.insert({})
,{}不是字典,与Python语言区分。
插入多条数据:db.集合名.insert([{},{}])
> db.test.insert({x:1}) # 插入单条数据
WriteResult({ "nInserted" : 1 })
> for(i=2;i<10;i++)db.test.insert({x:i}) # 用for循环插入多条数据
WriteResult({ "nInserted" : 1 })
> db.test.insert([{name:"jerry"},{age:18}]) # 手动插入多条数据
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.test.find()
{ "_id" : ObjectId("6051c3c5236fc1ddda5f663e"), "x" : 1 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6640"), "x" : 2 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6641"), "x" : 3 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6642"), "x" : 4 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6643"), "x" : 5 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6644"), "x" : 6 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6645"), "x" : 7 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6646"), "x" : 8 }
{ "_id" : ObjectId("6051c770236fc1ddda5f6647"), "x" : 9 }
{ "_id" : ObjectId("6051c868236fc1ddda5f6648"), "name" : "jerry" }
{ "_id" : ObjectId("6051c868236fc1ddda5f6649"), "age" : 18 }
3.2 更新(保存)数据:
具体命令:db.集合名.save()
,更新会覆盖前面的这个数据。
> db.createCollection("stu")
{ "ok" : 1 }
> db.stu.insert({name:"jerry",age:18})
WriteResult({ "nInserted" : 1 })
> db.stu.find()
{ "_id" : ObjectId("6051c9e0236fc1ddda5f664c"), "name" : "jerry", "age" : 18 }
> db.stu.save({_id:ObjectId("6051c9e0236fc1ddda5f664c"), name:"tony"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.stu.find()
{ "_id" : ObjectId("6051c9e0236fc1ddda5f664c"), "name" : "tony" }
> db.stu.save({name:"cheney",gender:"male"})
WriteResult({ "nInserted" : 1 })
> db.stu.find()
{ "_id" : ObjectId("6051c9e0236fc1ddda5f664c"), "name" : "tony" }
{ "_id" : ObjectId("6051caad236fc1ddda5f664d"), "name" : "cheney", "gender" : "male" }
由于每个数据的ID是唯一的,如果使用save命令时ID存在,则覆盖原有数据;如果不带ID,则相当于插入一条新数据。
3.3 查询数据
测试数据:
> db.stu.insert([{"name" : "张三", "hometown" : "⻓沙", "age" : 20, "gender" : 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}])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 7,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
查询所有数据:db.集合名.find({条件⽂档})
> db.stu.find()
{ "_id" : ObjectId("6051cd147de174714a04c4b1"), "name" : "张三", "hometown" : "⻓沙", "age" : 20, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b5"), "name" : "jerry", "hometown" : "⻓沙", "age" : 16, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b6"), "name" : "小永", "hometown" : "⼴州", "age" : 45, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b7"), "name" : "⽼amy", "hometown" : "衡阳", "age" : 18, "gender" : true }
pretty()方法:db.集合名.find({条件⽂档}).pretty()
,将结果格式化
> db.stu.find().pretty()
{
"_id" : ObjectId("6051cd147de174714a04c4b1"),
"name" : "张三",
"hometown" : "⻓沙",
"age" : 20,
"gender" : true
}
...
查询单条数据:db.集合名.findOne({条件⽂档})
,如果没有写条件则返回第一条数据。
> db.stu.findOne()
{
"_id" : ObjectId("6051cd147de174714a04c4b1"),
"name" : "张三",
"hometown" : "⻓沙",
"age" : 20,
"gender" : true
}
有条件查询数据:
> db.stu.find({age:18}) # 查找年龄等于18的数据
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b7"), "name" : "⽼amy", "hometown" : "衡阳", "age" : 18, "gender" : true }
> db.stu.find({age:18,gender:false}) # 查找年龄等于18且gender为false的数据
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
比较运算符:
等于:默认是等于判断,没有运算符
小于:$lt
小于等于:$lte
大于:$gt
大于等于:$gte
> db.stu.find({age:{$gt:18}}) # 查询年龄大于18的数据
{ "_id" : ObjectId("6051cd147de174714a04c4b1"), "name" : "张三", "hometown" : "⻓沙", "age" : 20, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b6"), "name" : "小永", "hometown" : "⼴州", "age" : 45, "gender" : true }
范围运算符:
使用$in,$nin判断是否在某个范围内。
> db.stu.find({age:{$in:[18,40]}}) # 查询年龄段为18-40的数据
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b7"), "name" : "⽼amy", "hometown" : "衡阳", "age" : 18, "gender" : true }
逻辑运算符:
or:使用$or,值为数组,数组中每个元素为json。
> db.stu.find({$or:[{age:{$gt:20}},{gender:false}]}) # 查找年龄大于20或者gender为false的数据
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b6"), "name" : "小永", "hometown" : "⼴州", "age" : 45, "gender" : true }
自定义查询:
mongo shell 是⼀个js的执行环境,使用$where写⼀个函数, 返回满足条件的数据。
# 查询年龄大于30的数据
> db.stu.find({$where:function() {return this.age>30;}})
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b6"), "name" : "小永", "hometown" : "⼴州", "age" : 45, "gender" : true }
3.4 操作查询结果
查出的数据求总数
命令:db.集合名.find().count()
> db.stu.find().count()
7
> db.stu.count() # 若查找没有条件,则和上述命令时等效的
7
limit和skip
limit用于读取指定数量的文档:db.集合名.find().limit(数量)
skip用于跳过指定数量的文档:db.集合名.find().skip(数量)
> db.stu.find().limit(2)
{ "_id" : ObjectId("6051cd147de174714a04c4b1"), "name" : "张三", "hometown" : "⻓沙", "age" : 20, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
> db.stu.find().skip(2)
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b5"), "name" : "jerry", "hometown" : "⻓沙", "age" : 16, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b6"), "name" : "小永", "hometown" : "⼴州", "age" : 45, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b7"), "name" : "⽼amy", "hometown" : "衡阳", "age" : 18, "gender" : true }
> db.stu.find().skip(2).limit(2) # 跳过2个,再读取2个数据
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
映射
指定返回的字段,如果为1则返回改字段,如果为0则除了改字段外所有字段返回。id如果没写会默认返回。
命令:db.集合名.find({},{key1:1,key2:1})
> db.stu.find({age:18},{name:1,age:1}) # 查找年龄等于18的数据且只需返回年龄和姓名
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "age" : 18 }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "age" : 18 }
{ "_id" : ObjectId("6051cd147de174714a04c4b7"), "name" : "⽼amy", "age" : 18 }
排序
命令:db.集合名.find({}).sort({key:1/-1})
> db.stu.find().sort({age:1}) # 按年龄升序
{ "_id" : ObjectId("6051cd147de174714a04c4b5"), "name" : "jerry", "hometown" : "⻓沙", "age" : 16, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b7"), "name" : "⽼amy", "hometown" : "衡阳", "age" : 18, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b1"), "name" : "张三", "hometown" : "⻓沙", "age" : 20, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b6"), "name" : "小永", "hometown" : "⼴州", "age" : 45, "gender" : true }
> db.stu.find().sort({age:-1}) # 按年龄降序
{ "_id" : ObjectId("6051cd147de174714a04c4b6"), "name" : "小永", "hometown" : "⼴州", "age" : 45, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b4"), "name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b1"), "name" : "张三", "hometown" : "⻓沙", "age" : 20, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b2"), "name" : "⽼李", "hometown" : "⼴州", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b3"), "name" : "王麻⼦", "hometown" : "北京", "age" : 18, "gender" : false }
{ "_id" : ObjectId("6051cd147de174714a04c4b7"), "name" : "⽼amy", "hometown" : "衡阳", "age" : 18, "gender" : true }
{ "_id" : ObjectId("6051cd147de174714a04c4b5"), "name" : "jerry", "hometown" : "⻓沙", "age" : 16, "gender" : true }