1. 程式人生 > >Python3 操作MongoDB資料庫

Python3 操作MongoDB資料庫

以上一篇的資料為例子。

In [1]: import pymongo    #引入pymongo模組

In [2]: client = pymongo.MongoClient(host = 'localhost',port = 27017)   #進行連線

In [3]: db = client.maoyan  #指定資料庫

In [4]: collection = db.MaoyanItem  #指定集合

這樣我們便聲明瞭一個Collection 物件。

一.查詢操作

In [6]: result = collection.find_one({'movie':'霸王別姬'})

In [7]: print (result)
{'_id': ObjectId('5bb94c820f99846600edcb13'), 'movie': '霸王別姬', 'actor': '主
演:張國榮,張豐毅,鞏俐', 'release': '上映時間:1993-01-01', 'score': '9.6'}

查詢評分為9.2分的電影。

In [8]: results = collection.find({'score':'9.2'})

In [9]: for result in results:
   ...:     print (result['movie'])
   ...:
唐伯虎點秋香
魂斷藍橋
喜劇之王
辛德勒的名單
春光乍洩
海上鋼琴師
指環王3:王者無敵
天堂電影院
盜夢空間
速度與激情5
甜蜜蜜
英雄本色

查詢評分大於9.2分的電影。

In [13]: results = collection.find({'score':{'$gt':'9.2'}})

In [14]: for result in results:
    ...:     print (result['movie'],result['score'])
    ...:
霸王別姬 9.6
肖申克的救贖 9.5
這個殺手不太冷 9.5
教父 9.3
泰坦尼克號 9.5
千與千尋 9.3
美麗人生 9.3
蝙蝠俠:黑暗騎士 9.3
機器人總動員 9.3
忠犬八公的故事 9.3
瘋狂原始人 9.5
大話西遊之月光寶盒 9.6

                                                                                比較符號。

正則匹配查詢。例如查詢評分在9.0以上的電影:

In [18]: results = collection.find({'score':{'$regex':'^9.*'}})

In [19]: for result in results:
    ...:     print (result['movie'],result['score'])
    ...:
霸王別姬 9.6
羅馬假日 9.1
肖申克的救贖 9.5
這個殺手不太冷 9.5
教父 9.3
泰坦尼克號 9.5
唐伯虎點秋香 9.2
千與千尋 9.3
魂斷藍橋 9.2
亂世佳人 9.1
喜劇之王 9.2
天空之城 9.1
大鬧天宮 9.0
辛德勒的名單 9.2
音樂之聲 9.0
春光乍洩 9.2
美麗人生 9.3
海上鋼琴師 9.2
黑客帝國 9.0
指環王3:王者無敵 9.2
哈利·波特與魔法石 9.1
無間道 9.1
蝙蝠俠:黑暗騎士 9.3
教父2 9.0
指環王2:雙塔奇兵 9.1
機器人總動員 9.3
活著 9.0
天堂電影院 9.2
盜夢空間 9.2
哈爾的移動城堡 9.0
忠犬八公的故事 9.3
瘋狂原始人 9.5
阿凡達 9.0
十二怒漢 9.1
速度與激情5 9.2
馴龍高手 9.0
神偷奶爸 9.0
三傻大鬧寶萊塢 9.1
斷背山 9.0
美國往事 9.1
少年派的奇幻漂流 9.1
哈利·波特與死亡聖器(下) 9.0
大話西遊之月光寶盒 9.6
倩女幽魂 9.1
無敵破壞王 9.0
觸不可及 9.1
甜蜜蜜 9.2
素媛 9.1
小鞋子 9.1
螢火之森 9.0
穿條紋睡衣的男孩 9.0
竊聽風暴 9.0
忠犬八公物語 9.0
七武士 9.1
海洋 9.0
愛·回家 9.0
我愛你 9.0
遷徙的鳥 9.1
英雄本色 9.2

                                                       功能符號

計數:

In [20]: collection.find().count()   #所有資料條數
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts\ipython:1:
 DeprecationWarning: count is deprecated. Use Collection.count_documents instead
.
Out[20]: 100

In [21]: collection.find({'score':{'$gt':'9.2'}}).count()   #評分大於9.2分的電影數
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts\ipython:1:
 DeprecationWarning: count is deprecated. Use Collection.count_documents instead
.
Out[21]: 12

排序:

In [23]: results = collection.find().sort('score',pymongo.ASCENDING)

In [24]: for result in results:
    ...:     print (result['movie'],result['score'])
    ...:
剪刀手愛德華 8.8
搏擊俱樂部 8.8
V字仇殺隊 8.8
勇敢的心 8.8
黑客帝國3:矩陣革命 8.8
聞香識女人 8.8
飛越瘋人院 8.8
致命魔術 8.8
美麗心靈 8.8
夜訪吸血鬼 8.8
鋼琴家 8.8
本傑明·巴頓奇事 8.8
魔女宅急便 8.8
初戀這件小事 8.8
熔爐 8.8
新龍門客棧 8.8
大話西遊之大聖娶親 8.8
地球上的星星 8.8
恐怖直播 8.8
借東西的小人阿莉埃蒂 8.8
辯護人 8.8
加勒比海盜 8.9
楚門的世界 8.9
射鵰英雄傳之東成西就 8.9
拯救大兵瑞恩 8.9
東邪西毒 8.9
幽靈公主 8.9
風之谷 8.9
放牛班的春天 8.9
當幸福來敲門 8.9
飛屋環遊記 8.9
怦然心動 8.9
鬼子來了 8.9
蝙蝠俠:黑暗騎士崛起 8.9
時空戀旅人 8.9
7號房的禮物 8.9
海豚灣 8.9
上帝之城 8.9
一一 8.9
完美的世界 8.9
黃金三鏢客 8.9
大鬧天宮 9.0

偏移:


In [25]: results = collection.find().sort('score',pymongo.ASCENDING).skip(80)
#skip(80)表示偏移前面80個數據,即只需要後面20個數據

In [26]: for result in results:
    ...:     print (result['movie'],result['score'])
    ...:
春光乍洩 9.2
海上鋼琴師 9.2
指環王3:王者無敵 9.2
天堂電影院 9.2
盜夢空間 9.2
速度與激情5 9.2
甜蜜蜜 9.2
英雄本色 9.2
教父 9.3
千與千尋 9.3
美麗人生 9.3
蝙蝠俠:黑暗騎士 9.3
機器人總動員 9.3
忠犬八公的故事 9.3
肖申克的救贖 9.5
這個殺手不太冷 9.5
泰坦尼克號 9.5
瘋狂原始人 9.5
霸王別姬 9.6
大話西遊之月光寶盒 9.6

限制:

In [27]: results = collection.find().sort('score',pymongo.ASCENDING).skip(80).l
    ...: imit(5)
#limit(5)表示只取前面5條資料

In [28]: for result in results:
    ...:     print (result['movie'],result['score'])
    ...:
春光乍洩 9.2
海上鋼琴師 9.2
指環王3:王者無敵 9.2
天堂電影院 9.2
盜夢空間 9.2

更新:

更新”霸王別姬“的評分為9.9分。

In [29]: condition = {'movie':"霸王別姬"}

In [30]: movie = collection.find_one(condition)

In [31]: movie['score'] = "9.9"

In [32]: result = collection.update(condition,movie)  #呼叫update方法
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts\ipython:1:
 DeprecationWarning: update is deprecated. Use replace_one, update_one or update
_many instead.

In [33]: print (result)  # ok表示成功,nModified表示更新的資料條數
{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

In [34]: movie = collection.find_one(condition)

In [35]: print (movie)      #結果顯示評分為9.9,表示已經更新成功了。
{'_id': ObjectId('5bb94c820f99846600edcb13'), 'movie': '霸王別姬', 'actor': '主
演:張國榮,張豐毅,鞏俐', 'release': '上映時間:1993-01-01', 'score': '9.9'}

刪除:

In [36]: collection.find({'score':'9.5'}).count()   #查詢評分為9.5分的電影條數
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts\ipython:1:
 DeprecationWarning: count is deprecated. Use Collection.count_documents instead
.
Out[36]: 4

In [37]: collection.delete_many({'score':'9.5'})    #刪除評分為9.5分的電影
Out[37]: <pymongo.results.DeleteResult at 0x9264674988>

In [38]: collection.find({'score':'9.5'}).count()   #查詢結果為0,說明刪除成功
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts0\ipython:1:
 DeprecationWarning: count is deprecated. Use Collection.count_documents instead
.
Out[38]: 0

In [39]: collection.find().count()       #只剩下96條資料
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts\ipython:1:
 DeprecationWarning: count is deprecated. Use Collection.count_documents instead
.
Out[39]: 96