1.mongoDB簡介
1.NoSQL數(shù)據(jù)庫
數(shù)據(jù)庫:進行高效的血巍、有規(guī)則的進行數(shù)據(jù)持久化存儲的軟件
-
NoSQL數(shù)據(jù)庫:Not only sql甲献,指代非關(guān)系型數(shù)據(jù)庫
優(yōu)點:高可擴展性、分布式計算、低成本、靈活架構(gòu)前弯、半結(jié)構(gòu)化數(shù)據(jù)、簡化關(guān)聯(lián)關(guān)系
缺點:沒有標準化秫逝、有限查詢恕出、不直觀
-
常見NoSQL數(shù)據(jù)庫
列存儲:Hbase、Cassandra违帆、Hypertable
文檔存儲:MongoDB浙巫、CouchDB
k-v存儲:TokyoCabinet、BerkeleyDB前方、MemcacheDB狈醉、redis
對象存儲:Neo4J、Versant
Xml數(shù)據(jù)庫:BerkeleyDB惠险、BaseX
注:黑色加粗的為常用的數(shù)據(jù)庫
2.MongoDB概述
MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫苗傅。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數(shù)據(jù)存儲解決方案班巩。
MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品渣慕,是非關(guān)系數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的抱慌。
優(yōu)點:
- C++編寫的運行穩(wěn)定性能高的數(shù)據(jù)
- 模式自由
- 面向集合
- 完整索引支持
- 復制和高可用性
3.Mongodb術(shù)語解釋
- database--database:數(shù)據(jù)庫
- table – collection:數(shù)據(jù)庫表 – 集合
- row – document: 數(shù)據(jù)記錄 – 文檔
- column – field:數(shù)據(jù)字段 – 域
- index – index :索引 – 索引
- table-join – None:表連接~
- primary key – primary key :主鍵
4.MongoDB基本語法——數(shù)據(jù)類型
集合就是關(guān)系型書庫中的表
文檔對應關(guān)系型數(shù)據(jù)庫中的行
文檔:就是一個JSON對象逊桦,由KEY=VALUE鍵值對構(gòu)成
{“name”:”admin”, “gender”:”男”}
- 集合:存儲多個文檔,結(jié)構(gòu)不固定
{“name”:”admin”, “gender”:”男”}
{“name”:”manager”, “age”:23}
{“name”:”manager”, “phone”:”16868686868”}
數(shù)據(jù)庫:存儲多個集合
服務器:一個服務器中可以包含多個數(shù)據(jù)庫
- ObjectID:文檔id
- String:字符串
- Boolean:布爾值
- Integer:整數(shù)
- Double:浮點數(shù)
- Arrays:數(shù)組或者列表
- Object:嵌入的文檔
- Null:空值
- Timestamp:時間戳
- Date:日期時間
2.MySQL的安裝
回顧一下MySQL在ubuntu的安裝
- 在終端輸入命令
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
#安裝過程中會提示設(shè)置密碼什么的抑进,注意設(shè)置了不要忘了
- 安裝完畢后輸入以下命令檢測是否安裝成功
sudo netstat -tap | grep mysql
- 登陸mysql數(shù)據(jù)庫可以通過如下命令:
mysql -u root -p
-u 表示選擇登陸的用戶名寺渗, -p 表示登陸的用戶密碼匿情,上面命令輸入之后會提示輸入密碼兰迫,此時輸入密碼就可以登錄到mysql。
- 對于Mysql數(shù)據(jù)庫的操作用法之前總結(jié)過汁果,詳情見
3.Mongodb下載安裝
-
官方網(wǎng)站
注意:偶數(shù)為穩(wěn)定版,如1.6玲躯,奇數(shù)為開發(fā)版据德,如1.7
1.Windows下Mongodb安裝
我這里用的是zip安裝,安裝完畢后跷车,
- 在運行窗口輸入命令啟動數(shù)據(jù)庫
mongod --dbpath d:/data/db
- 打開一個新的窗口輸入命令
mongo
,用于數(shù)據(jù)庫操作
2.Linux下Mongodb安裝
MongoDB安裝很簡單,無需下載源文件姓赤,可以直接用apt-get命令進行安裝赡译。
1 . 打開終端仲吏,輸入以下命令:
sudo apt-get install mongodb
2 . 安裝完成后不铆,在終端輸入以下命令查看MongoDB版本:
mongo -version
3 . 啟動mongo數(shù)據(jù)庫
- 在終端輸入命令
sudo mongo
3.安裝pymongo
PyMongo是Mongodb的Python接口開發(fā)包裹唆,是使用python和Mongodb的推薦方式誓斥。
用Python操作MongoDB需要通過PyMongo,輸入命令安裝
pip install pymongo 默認安裝
pip install pymongo==2.8 安裝指定版本
pip install –upgrade pymongo 升級PyMongo
4.Mongodb基本使用
1.基本操作
mongoDB將數(shù)據(jù)存儲為一個文檔
數(shù)據(jù)由 key=value 的鍵值對的形式組成
數(shù)據(jù)的操作:增刪改查
nosql三元素:數(shù)據(jù)庫 – 集合 – 文檔 [--域]
2.基本語法
-
數(shù)據(jù)庫操作
db:查看當前指向的數(shù)據(jù)庫
show dbs:查看當前所有的數(shù)據(jù)庫
use <數(shù)據(jù)庫名稱>:指向一個數(shù)據(jù)庫
Use數(shù)據(jù)庫不會創(chuàng)建數(shù)據(jù)庫,如果操作數(shù)據(jù)會自動創(chuàng)建數(shù)據(jù)庫db.dropDatabase():刪除當前指向的數(shù)據(jù)庫
-
集合操作
show collections:查看當前數(shù)據(jù)庫所有集合
db.createCollection(<c_name> [, options]):創(chuàng)建一個集合
db.<集合名稱>.drop():刪除指定的集合
show collections 查看當前庫中所有的集合许帐,后面的collections不要加括號
db.createCollection(name, [optinos])
創(chuàng)建一個名稱為name的集合劳坑,后面的options表示創(chuàng)建的附帶選項
db.createCollection(“emp”):創(chuàng)建一個名稱為emp的名稱的集合
db.createCollection(“dept”, {“capped”: true, size: 5}):capped默認false
表示不設(shè)置上限,true表示設(shè)置上限需要設(shè)置size參數(shù)~表示達到上限時會將之前的數(shù)據(jù)覆蓋
-
增加數(shù)據(jù)
語法:
db.<集合名稱>.insert(文檔)
集合可以是原來存在的成畦,可以是不存在的
文檔:就是JSON格式表示的數(shù)據(jù)
簡單查詢:
db.<集合名稱>.find()
查詢指定集合的數(shù)據(jù)
db.student.insert({name:”jerry”, gender:”男”})
db.student.insert({_id:”1”, name:”tom”, gender:”女”, age:18})
-
更新數(shù)據(jù)
語法:
db.<集合名稱>.update(<query>, <update>,[multi:<boolean>])
指定屬性更新:
$opration
multi:默認false更新符合條件第一條距芬,設(shè)置true全集合更新
#更新符合條件的文檔
db.student.update({name:”tom”}, {name:”jerry”})
#更新符合條件的文檔中符合條件的域
db.student.update({name:”tom”}, {$set:{name:”jerry”}})
#更新符合條件的多行文檔及對應的域
db.student.update({}, {$set:{name:”donghua”}}, {multi:true})
-
保存數(shù)據(jù)
語法:
db.<集合名稱>.save(文檔)
特征:[ _id ]如果數(shù)據(jù)不存在就添加,如果數(shù)據(jù)存在修改
-
刪除數(shù)據(jù)
語法:
db.<集合名稱>.remove(<query>, {justone:<boolean>})
參數(shù)query:刪除文檔的條件
參數(shù)justOne:設(shè)置為true或者1循帐,刪除一條框仔;默認false刪除多條
查詢數(shù)據(jù)
-
基本查詢
find([{文檔條件}]):全集合查詢
findOne([{文檔條件}]):查詢第一個
pretty():將查詢結(jié)果格式化展示
- 比較運算符
默認判斷,無運算符
$lt:little~小于 <
$lte:little or equals~小于等于 <=
$gt:granter~大于 >
$gte:granter or equals~大于等于 >=
#查詢名稱為jerry的學生
db.student.find({name:”jerry”})
#查詢年齡已經(jīng)適婚年齡的學員
db.student.find({age:{$gte:20}})
-
邏輯運算符
邏輯與:并且運算拄养,默認操作离斩,無運算符
邏輯或:或者運算,$or
#查詢年齡已經(jīng)適婚年齡并且性別為女的學員
db.student.find({age:{$gte:20}, gender:”女”})
#查詢年齡大于18或者性別為男的學員
db.student.find({$or:[{age:{$gt:18}, {gender:”女”}]})
-
范圍運算符
**$in:判斷指定條件是否包含在某個范圍內(nèi)
**$nin:判斷指定條件是否不包含在某個范圍內(nèi)
#查詢年齡在18或者20的學員
db.student.find({age: {$in:[18,20]}})
#查詢年齡不是18 的學員
db.student.find({age: {$nin : [20]}})
- 限制查詢條數(shù)
<find>.limit(count)
- 排序
<find>.sort({字段:1/-1, ...})
db.student.find().sort({name:1})
1.表示升序排列 -1表示降序排列瘪匿,可以指定多個字段
- 統(tǒng)計
<find>.count()
db.<集合名稱>.count({條件})
兩種操作方式
1.查詢結(jié)果跛梗,通過count()統(tǒng)計數(shù)據(jù)
2. 通過count()直接添加條件統(tǒng)計數(shù)據(jù)
- 去重
db.<集合名稱>.distinct(“去重域名稱”, {條件})
查詢數(shù)據(jù)列表中,所有的年齡分布情況
db.student.distinct(“age”, {})
- 分頁
#隔n個數(shù)據(jù)查詢m個數(shù)據(jù)
db.hero.find().pretty().limit(m).skip(n)
5.Mongodb與python交互
- 之前學習了爬蟲棋弥,現(xiàn)在我們把爬取得到的數(shù)據(jù)存儲于Mongodb中
#-*- coding:utf-8 -*-
import pymongo
import requests
from bs4 import BeautifulSoup
#建立于MongoClient 的連接
client = pymongo.MongoClient('localhost',27017)
#得到數(shù)據(jù)庫
hero = client['hero']
#得到一個數(shù)據(jù)集合
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)