文章目录
1.mongoDB简介
mongo全版本下载地址:https://www.mongodb.org/dl/linux/
1.1 NoSQL数据库
- 数据库:进行高效的、有规则的进行数据持久化存储的软件
- NoSQL数据库:Not only sql,指代非关系型数据库
- 优点:高可扩展性、分布式计算、低成本、灵活架构、半结构化数据、简化关联关系
- 缺点:没有标准化、有限查询、不直观
- 常见NoSQL数据库
- 列存储:**Hbase、**Cassandra、Hypertable
- 文档存储:**MongoDB、**CouchDB
- k-v存储:TokyoCabinet、BerkeleyDB、MemcacheDB、redis
- 对象存储:Neo4J、Versant
- Xml数据库:BerkeleyDB、BaseX
注:黑色加粗的为常用的数据库
1.2.MongoDB概述
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
优点:
- C++编写的运行稳定性能高的数据
- 模式自由
- 面向集合
- 完整索引支持
- 复制和高可用性
1.3.Mongodb术语解释
- database–database:数据库
- table – collection:数据库表 – 集合
- row – document: 数据记录 – 文档
- column – field:数据字段 – 域
- index – index :索引 – 索引
- table-join – None:表连接~
- primary key – primary key :主键
1.4.MongoDB基本语法——数据类型
- 集合就是关系型书库中的表
- 文档对应关系型数据库中的行
- 文档:就是一个JSON对象,由KEY=VALUE键值对构成
{“name”:”admin”, “gender”:”男”}
集合:存储多个文档,结构不固定
{“name”:”admin”, “gender”:”男”}
{“name”:”manager”, “age”:23}
{“name”:”manager”, “phone”:”16868686868”}
- 数据库:存储多个集合
- 服务器:一个服务器中可以包含多个数据库
- ObjectID:文档id
- String:字符串
- Boolean:布尔值
- Integer:整数
- Double:浮点数
- Arrays:数组或者列表
- Object:嵌入的文档
- Null:空值
- Timestamp:时间戳
- Date:日期时间
2.Mongodb下载安装
- 官方网站
注意:偶数为稳定版,如1.6,奇数为开发版,如1.7
2.1.Windows下Mongodb安装
我这里用的是zip安装,安装完毕后,
- 在cmd窗口输入命令启动数据库
mongod --dbpath D:\软件安装\MongoDB\data\db(此处是db的路径)
- 打开一个新的窗口输入命令mongo,用于数据库操作
2.2.Linux下Mongodb安装
2.2.1 yum 或 apt-get 安装
MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。
1 . 打开终端,输入以下命令:
sudo apt-get install mongodb
2 . 安装完成后,在终端输入以下命令查看MongoDB版本:
mongo -version
3 . 启动mongo数据库
在终端输入命令
sudo mongo
2.2.2 安装包安装
官方下载地址:https://www.mongodb.com/download-center/community
上传解压
1、rz命令上传
2、解压安装
解压:tar -zxvf mongodb-linux-x86_64-4.0.6.tgz
移动:mv ./mongodb-linux-x86_64-4.0.6 /usr/local/mongodb
配置conf与目录
1、进入mongodb目录
cd /usr/local/mongodb/
2、创建db目录和日志文件
mkdir -p ./data/db
mkdir -p ./logs
touch ./logs/mongodb.log
3、创建mongodb.conf文件
vim mongodb.conf
添加以下内容
#端口号
port=27017
#db目录
dbpath=/usr/local/mongodb/data/db
#日志目录
logpath=//usr/local/mongodb/logs/mongodb.log
#后台
fork=true
#日志输出
logappend=true
#允许远程IP连接
bind_ip=0.0.0.0
maxConns=100 #最大同时连接数
noauth=true #不启用验证
journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
storageEngine=wiredTiger #存储引擎有mmapv1、wiretiger、mongorocks
启动测试
1、启动
./bin/mongod --config mongodb.conf
2)连接
./bin/mongo
3)测试
授权登录
在日常工作中我们不可能把数据库设置为免认证登录并暴露在公网下,所以我们需要为数据库添加用户名和密码,具体操作如下:
vim mongodb.conf
打开后如图:
我们把noauth那一行,前面加上#,注释掉。
再在最后一行添加 auth = true
完整代码如下:
port=27017 #端口
dbpath= /usr/mongodb/db #数据库存文件存放目录
logpath= /usr/mongodb/log/mongodb.log #日志文件存放路径
logappend=true #使用追加的方式写日志
fork=true #以守护进程的方式运行,创建服务器进程
maxConns=100 #最大同时连接数
#noauth = true #不启用验证
journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
storageEngine=wiredTiger #存储引擎有mmapv1、wiretiger、mongorocks
bind_ip = 0.0.0.0 #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB
auth = true #用户认证
保存退出,启动数据库。
在添加用户名之前应该先执行./mongo命令先打开mongodb数据库
依次执行下列命令 添加用户名
//使用admin数据库
use admin
//给admin数据库添加管理员用户名和密码,用户名和密码请自行设置
db.createUser({user:"admin",pwd:"123456",roles:["root"]})
//验证是否成功,返回1则代表成功
db.auth("admin", "123456")
//切换到要设置的数据库,以test为例
use test
//为test创建用户,用户名和密码请自行设置。
db.createUser({user: "test", pwd: "123456", roles: [{ role: "dbOwner", db: "test" }]})
执行完后,ctrl + c结束shell,并通过关闭,打开进行重启数据库。
配置mongodb服务开机启动
1)设置mongodb.service开机服务启动
cd /lib/systemd/system
cat >>mongodb.service<<"EOF"
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/mongodb.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后设置mongodb.service权限
chmod +x mongodb.service
#启动服务
systemctl start mongodb.service
#停止服务
systemctl stop mongodb.service
#添加开机自启动
systemctl enable mongodb.service
#重启服务
systemctl restart mongodb.service
2)添加环境变量
1、直接用export命令:
export PATH=$PATH:/usr/local/mongodb/bin
2、修改profile文件:
cat >>/etc/profile<<"EOF"
export PATH="$PATH:/usr/local/mongodb/bin"
#刷新profile文件:
source /etc/profile
3、 修改.bashrc
文件:
cat >>/root/.bashrc<<"EOF"
export PATH="$PATH:/usr/local/mongodb/bin"
上述三步依次执行完毕,环境变量配置完成!!!!
重启服务器,输入mongo 回车就有了。。。。。
3.安装pymongo
PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式。
用Python操作MongoDB需要通过PyMongo,输入命令安装
pip install pymongo 默认安装
pip install pymongo==2.8 安装指定版本
pip install –upgrade pymongo 升级PyMongo
4.Mongodb基本使用
4.1.基本操作
- mongoDB将数据存储为一个文档
- 数据由 key=value 的键值对的形式组成
- 数据的操作:增删改查
- nosql三元素:数据库 – 集合 – 文档 [–域]
4.2.基本语法
- 数据库操作
- db:查看当前指向的数据库
- show dbs:查看当前所有的数据库
- use <数据库名称>:指向一个数据库
Use数据库不会创建数据库,如果操作数据会自动创建数据库 - db.dropDatabase():删除当前指向的数据库
- 集合操作
- show collections:查看当前数据库所有集合
- db.createCollection(<c_name> [, options]):创建一个集合
- db.<集合名称>.drop():删除指定的集合
show collections 查看当前库中所有的集合,后面的collections不要加括号
db.createCollection(name, [optinos])
创建一个名称为name的集合,后面的options表示创建的附带选项
db.createCollection(“emp”):创建一个名称为emp的名称的集合
db.createCollection(“dept”, {“capped”: true, size: 5}):capped默认false
表示不设置上限,true表示设置上限需要设置size参数~表示达到上限时会将之前的数据覆盖
- 增加数据
- 语法:db.<集合名称>.insert(文档)
- 集合可以是原来存在的,可以是不存在的
- 文档:就是JSON格式表示的数据
- 简单查询:**db.<集合名称>.find()**查询指定集合的数据
db.student.insert({name:”jerry”, gender:”男”})
db.student.insert({_id:”1”, name:”tom”, gender:”女”, age:18})
- 更新数据
- 语法:db.<集合名称>.update(, ,[multi:])
- 指定属性更新:$opration
- multi:默认false更新符合条件第一条,设置true全集合更新
#更新符合条件的文档
db.student.update({name:”tom”}, {name:”jerry”})
#更新符合条件的文档中符合条件的域
db.student.update({name:”tom”}, {$set:{name:”jerry”}})
#更新符合条件的多行文档及对应的域
db.student.update({}, {$set:{name:”donghua”}}, {multi:true})
-
保存数据
- 语法:db.<集合名称>.save(文档)
- 特征:[ _id ]如果数据不存在就添加,如果数据存在修改
-
删除数据
- 语法:db.<集合名称>.remove(, {justone:})
- 参数query:删除文档的条件
- 参数justOne:设置为true或者1,删除一条;默认false删除多条
查询数据
-
基本查询
- find([{文档条件}]):全集合查询
- findOne([{文档条件}]):查询第一个
- pretty():将查询结果格式化展示
-
比较运算符
默认判断,无运算符
$lt:little~小于 <
$lte:little or equals~小于等于 <=
$gt:granter~大于 >
$gte:granter or equals~大于等于 >=
#查询名称为jerry的学生
db.student.find({name:”jerry”})
#查询年龄已经适婚年龄的学员
db.student.find({age:{$gte:20}})
- 逻辑运算符
- 逻辑与:并且运算,默认操作,无运算符
- 逻辑或:或者运算,$or
#查询年龄已经适婚年龄并且性别为女的学员
db.student.find({age:{$gte:20}, gender:”女”})
#查询年龄大于18或者性别为男的学员
db.student.find({$or:[{age:{$gt:18}, {gender:”女”}]})
- 范围运算符
- $in:判断指定条件是否包含在某个范围内
- $nin:判断指定条件是否不包含在某个范围内
#查询年龄在18或者20的学员
db.student.find({age: {$in:[18,20]}})
#查询年龄不是18 的学员
db.student.find({age: {$nin : [20]}})
- 限制查询条数
<find>.limit(count)
- 排序
<find>.sort({字段:1/-1, ...})
db.student.find().sort({name:1})
1.表示升序排列 -1表示降序排列,可以指定多个字段
- 统计
<find>.count()
db.<集合名称>.count({条件})
两种操作方式
1.查询结果,通过count()统计数据
2. 通过count()直接添加条件统计数据
- 去重
db.<集合名称>.distinct(“去重域名称”, {条件})
查询数据列表中,所有的年龄分布情况
db.student.distinct(“age”, {})
- 分页
#隔n个数据查询m个数据
db.hero.find().pretty().limit(m).skip(n)
5.Mongodb与python交互
之前学习了爬虫,现在我们把爬取得到的数据存储于Mongodb中
#爬取英雄联盟英雄信息详情,并存储
#-*- coding:utf-8 -*-
import pymongo
import requests
from bs4 import BeautifulSoup
#建立于MongoClient 的连接
client = pymongo.MongoClient('localhost',27017)
#得到数据库
hero = client['hero']
#得到一个数据集合
sheet_tab = hero['sheet_tab']
url = 'http://lol.duowan.com/hero/'
req = requests.get(url)
soup = BeautifulSoup(req.text,'html.parser')
links = soup.find(id="champion_list").find_all('a')
for link in links:
link = link['href']
requ = requests.get(link)
sop = BeautifulSoup(requ.text,'html.parser')
data = {
'title' : sop.find('h2',class_="hero-title").get_text(),
'name' : sop.find('h1',class_="hero-name").get_text(),
'tags' : sop.find('div',class_="hero-box ext-attr").find_all('span')[1].get_text(),
'story' : sop.find('div',class_="hero-popup").find_all('p')[0].get_text(),
}
sheet_tab.insert_one(data)
开启mongo,运行代码
参考:https://www.cnblogs.com/xiaoyaojinzhazhadehangcheng/p/12156597.html
https://www.cnblogs.com/jasonLiu2018/p/13088971.html