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. 大数据量和高性能;
  3. 良好的支持:完善的文档+齐全的驱动支持。

1.2 下载与安装

官网链接:https://www.mongodb.com/download-center/community

爬到的数据存储到hdfs什么意思_爬虫


下载完安装包(msi文件),双加打开按步骤安装:

爬到的数据存储到hdfs什么意思_爬到的数据存储到hdfs什么意思_02


爬到的数据存储到hdfs什么意思_爬虫_03


爬到的数据存储到hdfs什么意思_爬到的数据存储到hdfs什么意思_04


安装完成后,要将bin文件的目录添加到path环境变量中,如下图:

爬到的数据存储到hdfs什么意思_mongodb_05

1.3 运行MongDB

启动服务:

> mongod -- dbpath C:\Program Files\MongoDB\Server\4.4\data

链接服务:

mongo

爬到的数据存储到hdfs什么意思_mongodb_06


在环境变量设置好的前提下,就可以进入终端进行一些操作,比如查看帮助命令:

> mongo -help

爬到的数据存储到hdfs什么意思_爬到的数据存储到hdfs什么意思_07

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

数据库的命名规范

  1. 不能是空的字符串;
  2. 不能含有特殊字符;
  3. 应该全部小写;
  4. 不能和系统保留的数据库重名;
  5. 最多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 }