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實例,否則會報警告给赞。
具體就是:
- 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
連接
>>> 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(...)