【看完就會用】pymongo

pymongo的使用

python3.7版本瞎疼。

安裝

? 大部分都從安裝開始。

pip3 install pymongo

連接數(shù)據(jù)庫

連接上mongo庫(未認(rèn)證)

In [1]: from pymongo import MongoClient
In [3]: client = MongoClient(host='10.251.1.162', port=28019)
In [4]: client
Out[4]: MongoClient(host=['10.251.1.162:28019'], document_class=dict, tz_aware=False, connect=True)
# connect為True表示已經(jīng)連接上了庫

現(xiàn)在登錄的是Mongo的客戶端相當(dāng)于 mongo --host 10.251.1.162概漱,并沒有進(jìn)行庫的登錄

現(xiàn)在我們不著急丑慎,可以dir下看下,其中包含了什么參數(shù)

一些默認(rèn)值的介紹

 'address',   # 查看當(dāng)前連接的地址
In [10]: client.address
Out[10]: ('10.251.1.162', 28019)
 'arbiters',    # 查看仲裁者
 'close',       # 關(guān)閉連接
 'close_cursor', 
 'database_names',  # 查看所有數(shù)據(jù)庫的名字瓤摧,這里需要進(jìn)行認(rèn)證后查看竿裂,否則會報 OperationFailure: command listDatabases requires authentication
 'get_database',    # 獲取數(shù)據(jù)庫,這里可以  
In [22]: admin = client.get_database('admin') # 可以直接使用client.admin
 'is_mongos',    # 是否為mongo的mongos路由代理
In [27]: client.is_mongos
Out[27]: True    # 這里我使用的就是mongos路由代理
 'is_primary',   # 是否為主節(jié)點
 'list_database_names',  # 等同于 database_names()
 'max_pool_size',        # 當(dāng)前最大連接數(shù)
In [40]: client.max_pool_size
Out[40]: 100        # 所以表明默認(rèn)有100個連接數(shù)

這里引入了一個問題照弥,pymongo中max_pool_size是如何工作的腻异?

Pymongo為線程安全的,(見官網(wǎng))但不是進(jìn)程安全的这揣。

實例不能從父進(jìn)程復(fù)制到子進(jìn)程悔常,父子進(jìn)程必須有自己的MongoClient實例,否則會報警告给赞。

國內(nèi)翻譯請見

具體就是:

  • pymongo中有一個內(nèi)置的線程池机打,默認(rèn)值為100;
  • max_pool_size 設(shè)置最大連接數(shù)片迅, max_idle_time設(shè)置一個連接在連接池中保持空閑的最大毫秒數(shù)残邀;
  • waitQueueTimeoutMS 可以限制等待線程的數(shù)量;

?

數(shù)據(jù)庫認(rèn)證

  • 連接前進(jìn)行認(rèn)證
In [41]: client = MongoClient(host='10.251.1.162', port=28019, username='root', password='12345', authSource='admin')
In [42]: client
Out[42]: MongoClient(host=['10.251.1.162:28019'], document_class=dict, tz_aware=False, connect=True, authsource='admin')
  • 連接后進(jìn)行認(rèn)證
In [46]: client = MongoClient(host='10.251.1.162', port=28019)
In [47]: db = client.admin
In [48]: db
Out[48]: Database(MongoClient(host=['10.251.1.162:28019'], document_class=dict, tz_aware=False, connect=True), 'admin')
In [49]: db.authenticate('root', '12345')
Out[49]: True

增刪查改

  • 增加
# 增加一條數(shù)據(jù)
In [56]: db = client.test   # 獲取數(shù)據(jù)庫
In [57]: col = db.test      # 獲取集合
In [58]: test = {'user': 'tangluoyan', 'age': 24}   # 組織數(shù)據(jù)
In [59]: _id = col.insert_one(test).inserted_id()   # 插入數(shù)據(jù)柑蛇, 并返回object_id
# 增加多條數(shù)據(jù)
In [63]: items = []
In [64]: for i in range(3):
    ...:     item = {'user': 'tangluoyan'+str(i), 'age': (24 + i)}
In [65]: for i in range(3):
    ...:     item = {'user': 'tangluoyan'+str(i), 'age': (24 + i)}
    ...:     items.append(item)
In [66]: result = col.insert_many(items)
In [68]: result.inserted_ids
Out[68]:
[ObjectId('5d55432d96b7626feef7ac9f'),
 ObjectId('5d55432d96b7626feef7aca0'),
 ObjectId('5d55432d96b7626feef7aca1')]
  • 查找

查出匹配的第一個數(shù)據(jù)

In [69]: user = col.find_one()
In [70]: user
Out[70]: {'_id': ObjectId('5d5541f896b7626feef7ac9e'), 'user': 'tangluoyan', 'age': 24}

條件查詢

In [77]: col.find_one({'user': 'tangluoyan1'})
Out[77]: {'_id': ObjectId('5d55432d96b7626feef7aca0'), 'user': 'tangluoyan1', 'age': 25}

使用ObjectId查詢

In [78]: from bson import ObjectId
In [79]: col.find_one({'_id': ObjectId('5d55432d96b7626feef7aca0')})
Out[79]: {'_id': ObjectId('5d55432d96b7626feef7aca0'), 'user': 'tangluoyan1', 'age': 25}

未找到返回空

返回多個數(shù)據(jù)

In [82]: for item in col.find():
    ...:     print(item)
{'_id': ObjectId('5d5541f896b7626feef7ac9e'), 'user': 'tangluoyan', 'age': 24}
{'_id': ObjectId('5d55432d96b7626feef7ac9f'), 'user': 'tangluoyan0', 'age': 24}
{'_id': ObjectId('5d55432d96b7626feef7aca0'), 'user': 'tangluoyan1', 'age': 25}
{'_id': ObjectId('5d55432d96b7626feef7aca1'), 'user': 'tangluoyan2', 'age': 26}

獲取總數(shù)

In [86]: col.count_documents({})
Out[86]: 4
# {}中填寫條件芥挣,必須要傳

時間操作

# 如果時間是字符串可以使用一下方法
In [87]: from dateutil import parser
In [92]: col.insert_one({'user':'tangluoyan33', 'age': 25, 'insert_time': parser.parse('2019-01-02 00:00:01')})
Out[92]: <pymongo.results.InsertOneResult at 0x7f6f42943388>
# 查詢
In [94]: col.find_one({'insert_time': {'$lt': datetime.now()}})
Out[94]:
{'_id': ObjectId('5d55470096b7626feef7aca2'),
 'user': 'tangluoyan33',
 'age': 25,
 'insert_time': datetime.datetime(2019, 1, 2, 0, 0, 1)}
  • 修改
In [96]: col.update_one({'user': 'tangluoyan'}, {'$set': {'age': 33}})
Out[96]: <pymongo.results.UpdateResult at 0x7f6f668d9308>
In [97]: col.find_one({'user': 'tangluoyan'})
Out[97]: {'_id': ObjectId('5d5541f896b7626feef7ac9e'), 'user': 'tangluoyan', 'age': 33}

Grid fs

見官網(wǎng)

連接

>>> from pymongo import MongoClient
>>> import gridfs
>>>
>>> db = MongoClient().gridfs_example #獲取到數(shù)據(jù)庫
>>> fs = gridfs.GridFS(db) #創(chuàng)建一個實例

插入并查詢,更新

>>> b = fs.put(fs.get(a), filename="foo", bar="baz")
>>> out = fs.get(b)
>>> out.read()
'hello world'
>>> out.filename
u'foo'
>>> out.bar
u'baz'
>>> out.upload_date
datetime.datetime(...)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻台,一起剝皮案震驚了整個濱河市空免,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盆耽,老刑警劉巖蹋砚,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼菠,死亡現(xiàn)場離奇詭異,居然都是意外死亡都弹,警方通過查閱死者的電腦和手機娇豫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畅厢,“玉大人冯痢,你說我怎么就攤上這事】蚨牛” “怎么了浦楣?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咪辱。 經(jīng)常有香客問我振劳,道長,這世上最難降的妖魔是什么油狂? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任历恐,我火速辦了婚禮,結(jié)果婚禮上专筷,老公的妹妹穿的比我還像新娘弱贼。我一直安慰自己,他們只是感情好磷蛹,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布吮旅。 她就那樣靜靜地躺著,像睡著了一般味咳。 火紅的嫁衣襯著肌膚如雪庇勃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天槽驶,我揣著相機與錄音责嚷,去河邊找鬼。 笑死掂铐,一個胖子當(dāng)著我的面吹牛罕拂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堡纬,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼聂受,長吁一口氣:“原來是場噩夢啊……” “哼蒿秦!你這毒婦竟也來了烤镐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棍鳖,失蹤者是張志新(化名)和其女友劉穎炮叶,沒想到半個月后碗旅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡镜悉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年祟辟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣肄。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡旧困,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稼锅,到底是詐尸還是另有隱情吼具,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布矩距,位于F島的核電站拗盒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锥债。R本人自食惡果不足惜陡蝇,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哮肚。 院中可真熱鬧登夫,春花似錦、人聲如沸绽左。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼窥。三九已至戏蔑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲁纠,已是汗流浹背总棵。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留改含,地道東北人情龄。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像捍壤,于是被迫代替她去往敵國和親骤视。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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