Python學(xué)習(xí)日記6|在python中操作MongoDB數(shù)據(jù)庫(kù)

今天是4.21號(hào)憋沿。

最近特別煩,不知是不是因?yàn)闆](méi)找到實(shí)習(xí)的緣故谨朝,加上論文還沒(méi)有消息回復(fù)卤妒。感覺(jué)馬上不是面臨找不到工作的壓力,就是可能畢不了業(yè)字币。看到周?chē)硕奸_(kāi)始實(shí)習(xí)共缕,自己在這里瞎折騰說(shuō)不擔(dān)心是安慰自己裝出來(lái)的洗出。

甚至開(kāi)始懷疑自己到底能夠做什么,到底準(zhǔn)備做什么图谷。問(wèn)問(wèn)自己翩活,一點(diǎn)底都沒(méi)有阱洪。技術(shù)技術(shù)做不了,產(chǎn)品產(chǎn)品做不了菠镇,想起去年這個(gè)時(shí)候也是在胡亂找實(shí)習(xí)冗荸,結(jié)果一事無(wú)成。

算了吧利耍,最低要求蚌本,先把畢業(yè)要求達(dá)到再說(shuō),否則其他一切都是免談隘梨〕贪可是那些雜志社敢不敢給我來(lái)個(gè)好消息,昂轴猎。


首先了解一下mongoDB中存儲(chǔ)數(shù)據(jù)時(shí)的一些概念


mongodb一些基本概念.png
mongodb中的數(shù)據(jù)類(lèi)型.png

對(duì)于數(shù)據(jù)庫(kù)的操作無(wú)外乎對(duì)表(集合)的操作和對(duì)數(shù)據(jù)(文檔)的操作嵌莉。在python中進(jìn)行下面的所有操作前,先必須有這幾條語(yǔ)句:

import pymongo

#與mongodb服務(wù)器建立連接
connection = pymongo.MongoClient('localhost', 27017)

student=connection['student'] #新建一個(gè)名為student的數(shù)據(jù)庫(kù)
或直接連接已有數(shù)據(jù)庫(kù)捻脖,類(lèi)似db = connection['tongcheng'],再直接使用數(shù)據(jù)庫(kù)的表content锐峭,infor=db['content']

connection.drop_database('student') #將名為student的數(shù)據(jù)庫(kù)刪除掉

#下面以student庫(kù)以及庫(kù)中的users集合(表)進(jìn)行講解:

一. 建表、刪除表可婶;
# 建立名為users的集合(表)沿癞,同建立數(shù)據(jù)庫(kù)形式一樣
users=student['users']
# 刪除users集合
student.users.drop()

二. 插入、刪除扰肌、更新記錄(文檔)抛寝;

(1)對(duì)建好的集合中插入數(shù)據(jù),用insert(),insert_one()函數(shù)
    users.insert_one({'nickname':'namei'}) #一般要在表前加上數(shù)據(jù)庫(kù)的名稱(chēng)即
    student.users.insert_one({'nickname':'namei'})

(2)刪除集合中的文檔曙旭,用remove()函數(shù)盗舰,刪除后的文檔無(wú)法恢復(fù)
    student.users.remove() 表示刪除集合里的所有記錄
    student.users.remove({'yy':5}) #表刪除yy=5的記錄
    
    id = student.users.find_one({'name':'user2'})['_id']
    student.users.remove(id) # 查找到name=user2的記錄,并根據(jù)記錄的 id 刪除該記錄

(3)更新記錄桂躏,用update()函數(shù)
    update(criteria, objNew, upsert, mult)
    criteria: 需要被更新的條件表達(dá)式
    objNew: 更新表達(dá)式
    upsert: 如目標(biāo)記錄不存在钻趋,是否插入新文檔。
    multi: 是否更新多個(gè)文檔剂习。

    student.users.update({'gid':last_gid, 'time':l_date}, {'$set':{'gid':last_gid}, '$set':{'time':l_date}, '$addToSet':{'categories':category_data}}, upsert=True)
    #上式表示添加'categories'字段到gid=last_gid,time=l_date的這條記錄中蛮位。

三. 數(shù)據(jù)的查詢(xún),這也是數(shù)據(jù)庫(kù)操作的重點(diǎn)

    基本上是用find()函數(shù)進(jìn)行查詢(xún)鳞绕,其中大于失仁、大于等于、小于们何、小于等于這些關(guān)系運(yùn)算符經(jīng)常要用到萄焦,
分別用'$gt','$gte','$lt','$lte'表示。

(1)查詢(xún)顯示符合條件的記錄
    # 查詢(xún) age 小于 15 的
    for u in student.users.find({"age":{"$lt":15}}): print u
    # 查詢(xún) name 等于 user8 的
    for u in student.users.find({"name":"user8"}): print u

    # 獲取查詢(xún)的一個(gè)記錄 (注意用find_one()而不是find())
    u2 = student.users.find_one({"name":"user9"}) # 查不到時(shí)返回 None
    print u2

(2)查詢(xún)符合條件的特定鍵 (fields)
    # select name, age from users 
    for u in student.users.find(fields = ['name', 'age']): print u

    # select name, age from users where age = 21
    for u in student.users.find({"age":21}, ["name", "age"]): print u
 *這里要注意,["name", "age"]中可以是一個(gè)拂封,也可以是多個(gè)茬射;同時(shí)["name", "age"]是放在條件{}外的。

(3)多條件查詢(xún)(Conditional Operators)    # like 的可使用正則表達(dá)式查詢(xún)

    # select * from users where name = 'user3' and age > 12 and age < 15
    for u in db.users.find({'age': {'$gt': 12, '$lt': 15}, 'name': 'user3'}): print u
    # select * from users where name = 'user1' and age = 21
    for u in db.users.find({"age":21, "name":"user1"}): print u

*記住冒签,使用find()函數(shù)時(shí)在抛,對(duì)應(yīng)的條件都是以字典形式表示{'age':{'$gt':12},'xx':'xx'},
有多個(gè)條件時(shí)萧恕,都放在一個(gè){}內(nèi)



(4)IN
    # select * from users where age in (23, 26, 32)
    for u in db.users.find({"age":{"$in":(23, 26, 32)}}): print u 
    # select * from users where age not in (23, 26, 32)
    for u in db.users.find({"age":{"$nin":(23, 26, 32)}}): print u 

(5)計(jì)數(shù)刚梭,用到count()函數(shù)
    # select count(*) from users  查詢(xún)users表中所有的記錄的個(gè)數(shù)   
    print(db.users.find().count()) 

    # select count(*) from users where age > 30 查詢(xún)users表中age>30的記錄的個(gè)數(shù)
    print(db.users.find({"age":{"$gt":30}}).count()) 


(6)對(duì)記錄進(jìn)行排序,用sort()函數(shù)廊鸥,形如find().sort('xx',1/-1)望浩,xx表示按xx的升序/降序排列,注意與后面的1/-1是用逗號(hào)(惰说,)隔開(kāi)
    pymongo.ASCENDING # 表按升序排列磨德,也可以用 1 來(lái)代替
    pymongo.DESCENDING #表按降序排列, 也可以用 -1 來(lái)代替
    for u in db.users.find().sort([("age", pymongo.ASCENDING)]): print u  # select * from 集合名 order by 鍵1
    for u in db.users.find().sort([("age", pymongo.DESCENDING)]): print u # select * from 集合名 order by 鍵1 desc
    for u in db.users.find().sort([("鍵1", pymongo.ASCENDING), ("鍵2", pymongo.DESCENDING)]): print u # select * from 集合名 order by 鍵1 asc, 鍵2 desc

(7)從第幾行開(kāi)始讀取(SLICE)吆视,讀取多少行(LIMIT)
    #從第2行開(kāi)始讀取典挑,讀取3行記錄
    for u in db.users.find().skip(2).limit(3): print u 
.
.

四. 多級(jí)路徑的元素值查詢(xún)

由于mongodb不支持表連接,所以文檔中采取 JSON 這種層級(jí)結(jié)構(gòu)存儲(chǔ)多層數(shù)據(jù)啦吧,我們可以直接用嵌入(Embed)代替?zhèn)鹘y(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的關(guān)聯(lián)引用(Reference)您觉。

MongoDB 支持以 "." 分割的 namespace 路徑,但條件表達(dá)式中的多級(jí)路徑須用引號(hào)包括起來(lái)

(1)# 條件表達(dá)式中的多級(jí)路徑須用引號(hào),以 "." 分割
    u = db.集合名.find_one({"im.qq":12345678})
    # 查詢(xún)結(jié)果如:{"_id" : ObjectId("4c479885089df9b53474170a"), "name" : "user1", "im" : {"msn" : "user1@hotmail.com", "qq" : 12345678}}

    print u['im']['msn']   #表打印出: user1@hotmail.com

(2)# 多級(jí)路徑的更新
    db.集合名.update({"im.qq":12345678}, {'$set':{"im.qq":12345}})

(3)for u in db.users.find({'data':"abc"}): print u
  # 顯示如: { "_id" : ObjectId("4c47a481b48cde79c6780df5"), "name" : "user8", "data" : [ { "a" : 1, "b" : 10 }, 3, "abc" ] }

五授滓、mongodb中數(shù)據(jù)類(lèi)型轉(zhuǎn)換

對(duì)于一條記錄x琳水,若其字段'price'為string型,則可以如下轉(zhuǎn)換為int型般堆。
     x['price']=int(x['price'])

$type: 用于判斷屬性類(lèi)型在孝。
    for u in db.users.find({'t':{'$type':1}}): print u # 查詢(xún)數(shù)字類(lèi)型的
    for u in db.users.find({'t':{'$type':2}}): print u # 查詢(xún)字符串類(lèi)型的
  各種類(lèi)型值的代表值:
    double:1
    string: 2
    object: 3
    array: 4
    binary data: 5
    object id: 7
    boolean: 8
    date: 9
    null: 10

六、導(dǎo)入json格式數(shù)據(jù)到Mongodb中
(1)首先打開(kāi)cmd淮摔,然后運(yùn)行cd c:\mongodb(\server\3.2)\ bin私沮,即cd到bin目錄下,不同的電腦中路徑可能不同和橙。
(2)輸入命令:mongoimport --db ceshi --collection tongcheng --drop --file f:\xx.json
其中ceshi表示你將要在Mongo中新建的數(shù)據(jù)庫(kù)仔燕,tongcheng表示在ceshi數(shù)據(jù)庫(kù)下新建一個(gè)集合(即表),xx.json為要導(dǎo)入的數(shù)據(jù)魔招。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晰搀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子办斑,更是在濱河造成了極大的恐慌厕隧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俄周,死亡現(xiàn)場(chǎng)離奇詭異吁讨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)峦朗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)建丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人波势,你說(shuō)我怎么就攤上這事翎朱。” “怎么了尺铣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵拴曲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凛忿,道長(zhǎng)澈灼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任店溢,我火速辦了婚禮叁熔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘床牧。我一直安慰自己荣回,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布戈咳。 她就那樣靜靜地躺著心软,像睡著了一般。 火紅的嫁衣襯著肌膚如雪著蛙。 梳的紋絲不亂的頭發(fā)上删铃,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音册踩,去河邊找鬼泳姐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛暂吉,可吹牛的內(nèi)容都是我干的胖秒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼慕的,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阎肝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肮街,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤风题,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沛硅,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眼刃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摇肌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擂红。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖围小,靈堂內(nèi)的尸體忽然破棺而出昵骤,到底是詐尸還是另有隱情,我是刑警寧澤肯适,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布变秦,位于F島的核電站,受9級(jí)特大地震影響框舔,放射性物質(zhì)發(fā)生泄漏蹦玫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一雨饺、第九天 我趴在偏房一處隱蔽的房頂上張望钳垮。 院中可真熱鬧,春花似錦额港、人聲如沸饺窿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肚医。三九已至,卻和暖如春向瓷,著一層夾襖步出監(jiān)牢的瞬間肠套,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工猖任, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留你稚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓朱躺,卻偏偏與公主長(zhǎng)得像刁赖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子长搀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容