爬蟲環(huán)境準備之mongodb
簡介
MongoDB 是由C++語言編寫的萌庆,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。
在高負載的情況下币旧,添加更多的節(jié)點践险,可以保證服務器性能。
MongoDB 旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案吹菱。
MongoDB 將數(shù)據(jù)存儲為一個文檔巍虫,數(shù)據(jù)結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象鳍刷。
主要特點
- MongoDB的提供了一個面向文檔存儲占遥,操作起來比較簡單和容易。
- 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現(xiàn)更快的排序输瓜。
- 你可以通過本地或者網(wǎng)絡創(chuàng)建數(shù)據(jù)鏡像瓦胎,這使得MongoDB有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) 尤揣,它可以分布在計算機網(wǎng)絡中的其他節(jié)點上這就是所謂的分片搔啊。
- Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記芹缔,可輕易查詢文檔中內(nèi)嵌的對象及數(shù)組坯癣。
- MongoDb 使用update()命令可以實現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
- Mongodb中的Map/reduce主要是用來對數(shù)據(jù)進行批量處理和聚合操作最欠。
- Map和Reduce示罗。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進行處理芝硬。
- Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的蚜点,并可以通過db.runCommand或mapreduce命令來執(zhí)行MapReduce操作。
- GridFS是MongoDB中的一個內(nèi)置功能拌阴,可以用于存放大量小文件绍绘。
- MongoDB允許在服務端執(zhí)行腳本,可以用Javascript編寫某個函數(shù)迟赃,直接在服務端執(zhí)行陪拘,也可以把函數(shù)的定義存儲在服務端,下次直接調(diào)用即可纤壁。
- MongoDB支持各種編程語言:RUBY左刽,PYTHON,JAVA酌媒,C++欠痴,PHP,C#等多種語言秒咨。
- MongoDB安裝簡單喇辽。
數(shù)據(jù)庫關鍵名稱
- admin: 從權限的角度來看,這是"root"數(shù)據(jù)庫雨席。要是將一個用戶添加到這個數(shù)據(jù)庫菩咨,這個用戶自動繼承所有數(shù)據(jù)庫的權限。一些特定的服務器端命令也只能從這個數(shù)據(jù)庫運行陡厘,比如列出所有的數(shù)據(jù)庫或者關閉服務器抽米。
- local: 這個數(shù)據(jù)永遠不會被復制,可以用來存儲限于本地單臺服務器的任意集合
- config: 當Mongo用于分片設置時雏亚,config數(shù)據(jù)庫在內(nèi)部使用缨硝,用于保存分片的相關信息。
相關工具
- MongoDB提供了網(wǎng)絡和系統(tǒng)監(jiān)控工具Munin罢低,它作為一個插件應用于MongoDB中查辩。
- Gangila是MongoDB高性能的系統(tǒng)監(jiān)視的工具,它作為一個插件應用于MongoDB中网持。
- Fang of Mongo – 網(wǎng)頁式,由Django和jQuery所構成宜岛。
- Database Master — Windows的mongodb管理工具
安裝
下載地址
https://www.mongodb.org/downloads
下載brew
首先下載 brew官網(wǎng)中的mongodb規(guī)則,
brew tap mongodb/brew
下載成功時會有如下類似字眼:
==> Tapping mongodb/brew
Cloning into '/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew'...
remote: Enumerating objects: 67, done.
remote: Counting objects: 100% (67/67), done.
remote: Compressing objects: 100% (64/64), done.
remote: Total 570 (delta 23), reused 11 (delta 3), pack-reused 503
Receiving objects: 100% (570/570), 122.25 KiB | 149.00 KiB/s, done.
Resolving deltas: 100% (261/261), done.
Tapped 11 formulae (38 files, 195KB).
安裝mongodb
在這里功舀,我們安裝mongodb的4.4版本萍倡,可使用如下命令安裝:
brew install mongodb-community@4.4
安裝成功后會有如下類似提示:
==> Installing mongodb/brew/mongodb-community
==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
mongod --config /usr/local/etc/mongod.conf
==> Summary /usr/local/Cellar/mongodb-community/4.4.3: 11 files, 156.8MB, built in 6 seconds
==> Caveats
==> mongodb-community
To have launchd start mongodb/brew/mongodb-community now and restart at login:
brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
mongod --config /usr/local/etc/mongod.conf
根據(jù)提示可知道,后臺運行mongodb的方式:
brew services start mongodb/brew/mongodb-community
停止后臺服務:
brew services stop mongodb-community
前臺運行的方式如下:
mongod --config /usr/local/etc/mongod.conf
查看運行中的mongodb:
michaelkoo@MacBook work % ps -ef|grep mongodb
501 80402 1 0 12:38下午 ?? 0:02.62 /usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
501 80648 79888 0 12:47下午 ttys002 0:00.00 grep mongodb
由以上可知道辟汰,已在運行中列敲。
幾個關鍵文件說明
配置文件阱佛,/usr/local/etc/mongod.conf
日志目錄:/usr/local/var/log/mongodb
數(shù)據(jù)目錄:/usr/local/var/mongodb
測試
Mongodb自帶的shell測試
可以直接在命令行下進入shell交互窗口
michaelkoo@MacBook ~ % mongo
MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("52ab0789-d65c-49a8-9f4c-2358c7f4abc1") }
MongoDB server version: 4.4.3
---
The server generated these startup warnings when booting:
2021-03-30T21:06:02.553+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2021-03-30T21:06:02.553+08:00: Soft rlimits too low
2021-03-30T21:06:02.553+08:00: currentValue: 256
2021-03-30T21:06:02.553+08:00: recommendedMinimum: 64000
---
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
常見的shell命令
- db.hostInfo(),查看當前數(shù)據(jù)庫的主機信息
db.hostInfo()
{
"system" : {
"currentTime" : ISODate("2021-04-01T02:25:51.925Z"),
"hostname" : "MacBook.lan",
"cpuAddrSize" : 64,
"memSizeMB" : NumberLong(16384),
"memLimitMB" : NumberLong(16384),
"numCores" : 8,
"cpuArch" : "x86_64",
"numaEnabled" : false
},
...
...
"extra" : {
"versionString" : "Darwin Kernel Version 19.6.0: Mon Aug 31 22:12:52 PDT 2020; root:xnu-6153.141.2~1/RELEASE_X86_64",
"alwaysFullSync" : 0,
"nfsAsync" : 0,
"model" : "MacBookPro15,2",
"physicalCores" : 4,
"cpuFrequencyMHz" : 2400,
"cpuString" : "Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz",
"cpuFeatures" : "FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C SYSCALL XD 1GBPAGE EM64T LAHF LZCNT PREFETCHW RDTSCP TSCI",
"pageSize" : 4096,
"scheduler" : "dualq"
},
"ok" : 1
- db.stats()戴而,查看數(shù)據(jù)庫當前狀態(tài)
> db.stats()
{
"db" : "kk",
"collections" : 2,
"views" : 0,
"objects" : 3,
"avgObjSize" : 63,
"dataSize" : 189,
"storageSize" : 57344,
"indexes" : 2,
"indexSize" : 53248,
"totalSize" : 110592,
"scaleFactor" : 1,
"fsUsedSize" : 167403245568,
"fsTotalSize" : 250685575168,
"ok" : 1
}
- db.getLastError()岸梨,查看最近的一個錯誤写穴,如果沒有則返回null
> db.getLastError()
null
- db悼院,查詢當前數(shù)據(jù)庫,示例如下
> db
test
- show dbs,查看所有數(shù)據(jù)庫侠坎,示例如下
> show dbs
admin 0.000GB
config 0.000GB
kk 0.000GB
local 0.000GB
test 0.000GB
- use xx,xx是某個庫,切換到xx庫扶踊,
> use kk
switched to db kk
- show tables,查詢當前文檔的所有集合
> show tables
col
kcol
- db.collection.count(),查詢collection的數(shù)據(jù)量
> db.col.count()
2
> db.col.find()
{ "_id" : ObjectId("60652d50000178f64d7b2490"), "a" : "aaa", "b" : "bbb", "c" : "ccccc", "d" : "dddd" }
{ "_id" : ObjectId("60652d66000178f64d7b2491"), "a" : "a444", "b" : "333", "c" : "222", "d" : "111" }
- db.collection.stats()泄鹏,查詢集合的狀態(tài)
> db.col.stats()
{
"ns" : "kk.col",
"size" : 136,
"count" : 2,
"avgObjSize" : 68,
"storageSize" : 20480,
"freeStorageSize" : 0,
"capped" : false,
...
...
"nindexes" : 1,
"indexBuilds" : [ ],
"totalIndexSize" : 20480,
"totalSize" : 40960,
"indexSizes" : {
"_id_" : 20480
},
"scaleFactor" : 1,
"ok" : 1
- 數(shù)據(jù)導出,mongoexport
mongoexport --jsonArray -o mon.json -d kk -c col
以json數(shù)組形式導出kk庫的col集合的所有數(shù)據(jù)到mon.json文件中
- 數(shù)據(jù)導入,mongoimport
mongoimport --jsonArray --file mon.json -d kk -c kcol
connected to: mongodb://localhost/
2 document(s) imported successfully. 0 document(s) failed to import.
以json數(shù)組的形式把mon.json里面的數(shù)據(jù)導入到kk庫的 kcol集合中
查詢
查詢中有一些特殊的操作符需要注意:
操作符 | 格式 | 樣例 |
---|---|---|
相等(=) | {<key>:{<value>}} | db.test.find({'visit':24}) |
大于(>) | {<key>:{$gt:<value>}} | db.test.find({'visit':{$gt:18}}) |
小于(<) | {<key>:{$lt:<value>}} | db.test.find({'visit':{$lt:16}}) |
大于等于(>=) | {<key>:{$gte:<value>}} | db.test.find({'visit':{$gte:18}}) |
小于等于(<=) | {<key>:{$lte:<value>}} | db.test.find({'visit':{$lte:18}}) |
不等于(!=) | {<key>:{$ne:<value>}} | db.test.find({'visit':{$ne:16}}) |
與 | {key01:value01,key02:value02,..} | db.test.find({'visit':18,'date':'2021-02-14'}) |
或 | {$or:[{key01:value01},{key02:value02}...]} | db.test.find($or,[{'visit':10008},{'pv':18000}]) |
概括下查詢相關的操作符
1.常規(guī)的比較查詢操作符
$gt,大于
$lte秧耗,小于等于
$in备籽,包含
$nin,不包含
$lt绣版,小于
$gte胶台,大于等于
$ne,不等于
$eq杂抽,等于
2.常規(guī)的查詢操作符
$mod,取模
$regex,正則
$text,文本
$where,條件
$and,
$nor,
$not,
$or
3.元數(shù)據(jù)查詢操作符
$type,數(shù)據(jù)類型操作符
$exists诈唬,判斷字段是否存在操作符
4.聚合操作符
$sum,
$avg,
$stdDevPop,$stdDevSamp,不解其意
$min,
$max,
$first,根據(jù)文檔的排序獲取第一個文檔數(shù)據(jù)
$last缩麸,根據(jù)文檔的排序獲取最后一個文檔數(shù)據(jù)
$push铸磅,在結果文檔中插入值到一個數(shù)組中
$addToSet,在結果文檔中插入值到一個數(shù)組中杭朱,但不創(chuàng)建副本
添加
db.collection.insertOne({'key':'value'})
db.collection.insertMany([{'key01':'value01'},{'key02':'value 02'})
說明:
第一條命令阅仔,是往集合中添加一條數(shù)據(jù);
第二條命令弧械,是往集合中添加多條數(shù)據(jù)八酒,insertMany的參數(shù)是數(shù)組形式;
更新
db.collection.updateOne({'x': 1}, {'$inc': {'x': 3}})
db.collection.updateMany({'x': 1}, {'$inc': {'x': 3}})
db.collection.replaceOne({'x': 1}, {'y': 1})
說明:
第一條命令刃唐,是把值為1的x更改為值加3羞迷,x=4
第二條命令,是把所有值為1的x更改為值加3画饥,x=4
第三條命令衔瓮,是把值為1的x更改y,改的是key抖甘,值不變
更新相關的操作符
名稱 | 描述 |
---|---|
$inc | 自增操作符 |
|
最小操作符,最大操作符 |
$set | 設置操作符 |
$unset | 刪除操作符热鞍,操作key及值 |
$rename | 重命名操作符,修改key |
刪除
db.collection.deleteMany ({ 'ac' : "d" })
db.collection.deleteMany ({ 'ac' : {$regex:'a*'} })
db.collection.delete.One ({ 'ac' : "b" })
db.collection.deleteMany ({})
說明:
第一個命令是刪除ac值為d的數(shù)據(jù)
第二個命令是刪除ac值為a開頭的數(shù)據(jù),這里使用了mongo 的關鍵詞“$regex”薇宠,意思后面的值是正則表達式
最后一個是刪除collection下面的所有數(shù)據(jù)
Mongo in python
安裝pymongo庫
pip install pymongo
安裝成功后:
Collecting pymongo
Using cached pymongo-3.11.3-cp37-cp37m-macosx_10_6_intel.whl (414 kB)
Installing collected packages: pymongo
Successfully installed pymongo-3.11.3
實例
import pymongo
import re
import time
def mongo_init():
c = pymongo.MongoClient('mongodb://127.0.0.1/27017')
k_c = c['kk']
_create_data(k_c)
_find_data(k_c)
_update_data(k_c)
_delete_data(k_c)
pass
def _create_data(k_c):
"""
添加數(shù)據(jù),
先查詢是否存在偷办,不存在才插入
:param k_c:
:return:
"""
print('[*] insert data [*]')
d = {'ab': 'abc'}
if k_c['kcol'].find(d).count() <= 0:
r = k_c['kcol'].insert_one(d)
print(r.inserted_id, r.acknowledged, d)
ac = {'ac': 'this is ac'}
if k_c['kcol'].find(ac).count() <= 0:
r = k_c['kcol'].insert(ac)
print(f'insert ac :{r}')
ad = {'ac': 'this is ac two'}
if k_c['kcol'].find(ad).count() <= 0:
r = k_c['kcol'].insert(ad)
print(f'insert ad :{r}')
pass
def _find_data(k_c):
"""
查詢數(shù)據(jù),這里只列出最基本的查詢操作昼接,還有更多查詢請參考官網(wǎng)
:param k_c:
:return:
"""
print('\n[*] find data [*]')
cols = k_c['kcol'].find_one({'ac': re.compile('a')})
print(f'find one :{cols}\n')
cols = k_c['kcol'].find().sort('ac') # 無參數(shù)則表示查詢?nèi)? cols.next()
for i in cols:
print(f'find many:{i}')
pass
def _update_data(k_c):
# 更新
print('[*] update [*]')
k_c['kcol'].update_many({'ac': re.compile('a')}, {'$set': {'ac': 'ad--update:' + str(time.time_ns())}})
k_c['kcol'].replace_one({'ab': 'abc'}, {'ab_replace': 'abc is replace'})
cols = k_c['kcol'].find({'ac': re.compile('a')})
for col in cols:
print(col)
pass
def _delete_data(k_c):
# 刪除
print('[*] delete [*]')
f = {'ac': re.compile('ad')}
f_data = k_c['kcol'].find(f)
for fd in f_data:
print(f'before del:{fd}')
k_c['kcol'].delete_many(f)
cols = k_c['kcol'].find({'ac': re.compile('')})
for col in cols:
print(col)
pass
運行結果如下:
/Users/michaelkoo/work/env/csdn/code/ImgBianhua/venv/bin/python /Users/michaelkoo/work/env/csdn/code/ImgBianhua/main.py
[*] insert data [*]
6064892a2243504a9c23cb8e True {'ab': 'abc', '_id': ObjectId('6064892a2243504a9c23cb8e')}
insert ac :6064892a2243504a9c23cb8f
insert ad :6064892a2243504a9c23cb90
[*] find data [*]
find one :{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'this is ac'}
find many:{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'this is ac'}
find many:{'_id': ObjectId('6064892a2243504a9c23cb90'), 'ac': 'this is ac two'}
[*] update [*]
{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'ad--update:1617201450462799000'}
{'_id': ObjectId('6064892a2243504a9c23cb90'), 'ac': 'ad--update:1617201450462799000'}
[*] delete [*]
before del:{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'ad--update:1617201450462799000'}
before del:{'_id': ObjectId('6064892a2243504a9c23cb90'), 'ac': 'ad--update:1617201450462799000'}
Process finished with exit code 0