1.mongoDB簡介
1.NoSQL數據庫
數據庫:進行高效的、有規則的進行數據持久化存儲的軟件
-
NoSQL數據庫:Not only sql,指代非關系型數據庫
優點:高可擴展性、分布式計算、低成本、靈活架構、半結構化數據、簡化關聯關系
缺點:沒有標準化、有限查詢、不直觀
-
常見NoSQL數據庫
列存儲:Hbase、Cassandra、Hypertable
文檔存儲:MongoDB、CouchDB
k-v存儲:TokyoCabinet、BerkeleyDB、MemcacheDB、redis
對象存儲:Neo4J、Versant
Xml數據庫:BerkeleyDB、BaseX
注:黑色加粗的為常用的數據庫
2.MongoDB概述
MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。
優點:
- C++編寫的運行穩定性能高的數據
- 模式自由
- 面向集合
- 完整索引支持
- 復制和高可用性
3.Mongodb術語解釋
- database--database:數據庫
- table – collection:數據庫表 – 集合
- row – document: 數據記錄 – 文檔
- column – field:數據字段 – 域
- index – index :索引 – 索引
- table-join – None:表連接~
- primary key – primary key :主鍵
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.MySQL的安裝
回顧一下MySQL在ubuntu的安裝
- 在終端輸入命令
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
#安裝過程中會提示設置密碼什么的,注意設置了不要忘了
- 安裝完畢后輸入以下命令檢測是否安裝成功
sudo netstat -tap | grep mysql
- 登陸mysql數據庫可以通過如下命令:
mysql -u root -p
-u 表示選擇登陸的用戶名, -p 表示登陸的用戶密碼,上面命令輸入之后會提示輸入密碼,此時輸入密碼就可以登錄到mysql。
- 對于Mysql數據庫的操作用法之前總結過,詳情見
3.Mongodb下載安裝
-
官方網站
注意:偶數為穩定版,如1.6,奇數為開發版,如1.7
1.Windows下Mongodb安裝
我這里用的是zip安裝,安裝完畢后,
當前所在磁盤目錄下創建data文件夾
data文件夾中創建db文件夾和log文件夾
- 在運行窗口輸入命令啟動數據庫
mongod --dbpath d:/data/db
啟動mongoDB數據庫
- 打開一個新的窗口輸入命令
mongo
,用于數據庫操作
打開一個新的窗口,用于數據庫操作
2.Linux下Mongodb安裝
MongoDB安裝很簡單,無需下載源文件,可以直接用apt-get命令進行安裝。
1 . 打開終端,輸入以下命令:
sudo apt-get install mongodb
2 . 安裝完成后,在終端輸入以下命令查看MongoDB版本:
mongo -version
3 . 啟動mongo數據庫
- 在終端輸入命令
sudo 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基本使用
1.基本操作
mongoDB將數據存儲為一個文檔
數據由 key=value 的鍵值對的形式組成
數據的操作:增刪改查
nosql三元素:數據庫 – 集合 – 文檔 [--域]
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(<query>, <update>,[multi:<boolean>])
指定屬性更新:
$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(<query>, {justone:<boolean>})
參數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)