為什么nosql
在一個更加普遍通用的爬蟲程序中予颤,原始數(shù)據(jù)往往是雜亂且沒有規(guī)律的花竞,將這些數(shù)據(jù)存儲在關(guān)系型數(shù)據(jù)庫中的成本很高加叁,定義schema就是一個非常繁瑣復(fù)雜的工作,而且爬蟲數(shù)據(jù)一般沒有OLTP的需求迎卤,這時候使用nosql也許是更好的選擇。
為什么MongoDB
- MongoDB的提供了一個面向文檔存儲(類似于 JSON 對象玷坠,但比JSON支持更多數(shù)據(jù)類型)蜗搔,適用于整個對象存儲劲藐,操作起來比較簡單和容易。
- Mongo支持豐富的查詢表達(dá)式樟凄。查詢指令使用JSON形式的標(biāo)記聘芜,可輕易查詢文檔中內(nèi)嵌的對象及數(shù)組。
- MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔缝龄,適用于覆蓋歷史數(shù)據(jù)的操作汰现。
- 支持索引,有大量數(shù)據(jù)是保證了查詢速度二拐。
MongoDB使用
可以使用docker簡單的啟動一個沒有用戶認(rèn)證的mongo實(shí)例
docker run -itd --name mongo -p 27017:27017 mongo
寫入數(shù)據(jù)服鹅,在uper集合中插入一條文檔,集合不存在會自動創(chuàng)建百新。
> db.uper.insert({nick: 'C醬です',
uid:67141,
description: '一名普通玩家(:3rz) 直播間:live.bilibili.com/213',
tags: ['游戲', '單機(jī)游戲'],
fans: 6400000
})
查詢
# 查詢uper中所有的文檔
> db.uper.find().pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C醬です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播間:live.bilibili.com/213",
"tags" : [
"游戲",
"單機(jī)游戲"
],
"fans" : 6400000
}
{
"_id" : ObjectId("5fb1238d8f09d0de911ee41f"),
"nick" : "影視颶風(fēng)",
"uid" : 946974,
"description" : "商務(wù)合作/廣告/宣傳片/影視攝制私信",
"tags" : [
"影視"
],
"fans" : 1785000
}
{
"_id" : ObjectId("5fb123cd8f09d0de911ee420"),
"nick" : "黑桐谷歌",
"uid" : 43536,
"description" : "一個普通喜歡玩游戲的人",
"tags" : [
"游戲",
"單機(jī)游戲"
],
"fans" : 2260000
}
{
"_id" : ObjectId("5fb1245b8f09d0de911ee421"),
"nick" : "風(fēng)鈴秋石",
"uid" : 7722619,
"description" : "配了音的攻略視頻都推薦1.25倍速播放企软,LOL新手向攻略UP主。大部分攻略有很多分P可挑選觀看饭望,聲音天生仗哨,不喜勿噴!",
"tags" : [
"游戲",
"網(wǎng)絡(luò)游戲",
"英雄聯(lián)盟"
],
"fans" : 56000
}
# 查詢tag帶有"游戲"的文檔
> db.uper.find( { tags:'游戲' }).pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C醬です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播間:live.bilibili.com/213",
"tags" : [
"游戲",
"單機(jī)游戲"
],
"fans" : 6400000
}
{
"_id" : ObjectId("5fb123cd8f09d0de911ee420"),
"nick" : "黑桐谷歌",
"uid" : 43536,
"description" : "一個普通喜歡玩游戲的人",
"tags" : [
"游戲",
"單機(jī)游戲"
],
"fans" : 2260000
}
{
"_id" : ObjectId("5fb1245b8f09d0de911ee421"),
"nick" : "風(fēng)鈴秋石",
"uid" : 7722619,
"description" : "配了音的攻略視頻都推薦1.25倍速播放铅辞,LOL新手向攻略UP主厌漂。大部分攻略有很多分P可挑選觀看,聲音天生斟珊,不喜勿噴苇倡!",
"tags" : [
"游戲",
"網(wǎng)絡(luò)游戲",
"英雄聯(lián)盟"
],
"fans" : 56000
}
# 查詢tag帶有"游戲" 并且粉絲大于500萬的
> db.uper.find(
{
tags:'游戲',
fans:{"$gte" : 5000000}
}).pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C醬です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播間:live.bilibili.com/213",
"tags" : [
"游戲",
"單機(jī)游戲"
],
"fans" : 6400000
}
當(dāng)數(shù)據(jù)發(fā)生變化時 更新覆蓋舊數(shù)據(jù)
# 更新uid67141的uper的粉絲數(shù)
> db.uper.update({'uid':67141},{$set:{'fans':6600000}})
# 更新后的數(shù)據(jù)
> db.uper.find({uid:67141}).pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C醬です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播間:live.bilibili.com/213",
"tags" : [
"游戲",
"單機(jī)游戲"
],
"fans" : 6600000
}