前言:工欲善其事必先利其器,用pymongo庫(kù)之前,大家需首先對(duì)MongoDB數(shù)據(jù)庫(kù)的增刪改查操作有一些基礎(chǔ)方法的了解。 我們?cè)谶@里使用linux上的ipython交互環(huán)境來(lái)pymongo庫(kù)的知識(shí)點(diǎn)系統(tǒng)性講解。 一:如何用python連接MongoDB數(shù)據(jù)庫(kù)?1.1、使用MongoClient()方法建立連接 import pandas as pdhost:指定地址 localhost:XXX.XX.X.XXX port:指定端口 27017 把創(chuàng)立好的MongoDB的連接對(duì)象賦值為client 1.2、使用URL建立連接 另外MongoClient的第一個(gè)參數(shù)host還可以直接傳MongoDB的連接字符串,以mongodb開(kāi)頭,例如: 1.3 指定數(shù)據(jù)庫(kù) MongoDB中有許許多多個(gè)生產(chǎn)庫(kù),我們需要指定具體操作的數(shù)據(jù)庫(kù)。 我們調(diào)用client的test屬性即可返回test數(shù)據(jù)庫(kù) db = client.test或者 1.4 指定集合 MongoDB的每個(gè)數(shù)據(jù)庫(kù)又包含了許多集合Collection,也就類似與關(guān)系型數(shù)據(jù)庫(kù)中的表,用show tables命令可以查看數(shù)據(jù)庫(kù)中的各個(gè)集合名稱。下一步我們需要指定要操作的集合,在這里我們指定一個(gè)集合名稱為mygirlfriend(女朋友集合),指定集合也有兩種方式。 指定集合方式1 collection = db.mygirlfriend指定集合方式2 二、如何插入數(shù)據(jù)?2.1、insert_one()方法插入單條數(shù)據(jù) 接著,我們來(lái)插入數(shù)據(jù)myboyfriend #對(duì)于myboyfriend這個(gè)Collection,我們新建一條男朋友數(shù)據(jù),以字典的形式表示:輸出插入的文檔對(duì)應(yīng)的 _id 值 insert_one()方法返回InsertOneResult對(duì)象,該對(duì)象包含inserted_id屬性,它是插入文檔的id值。(在MongoDB中,每條數(shù)據(jù)其實(shí)都有一個(gè)_id屬性來(lái)唯一標(biāo)識(shí),如果沒(méi)有顯式指明_id,MongoDB會(huì)自動(dòng)產(chǎn)生一個(gè)ObjectId類型的_id屬性) 2.2、insert_many()方法插入多條數(shù)據(jù) 輸出插入的所有文檔對(duì)應(yīng)的 _id 值 print(result1.inserted_idsinsert_many()方法返回InsertManyResult對(duì)象,該對(duì)象包含inserted_ids屬性,該屬性保存著所有插入文檔的id值。 執(zhí)行完以上查找,我們可以在命令終端,查看mygirlfriend 數(shù)據(jù)是否已插入: 三、如何查詢數(shù)據(jù)?3.1find_one()方法來(lái)查詢mygirlfriend集合中的一條數(shù)據(jù)。 client = MongoClient('XXX.XX.X.XXX',27017)接著,我們?cè)賮?lái)根據(jù)指定條件查詢細(xì)分查詢 在這里我們查詢name為JOSIE的mygirlfriend集合數(shù)據(jù),它的返回結(jié)果是字典類型,運(yùn)行結(jié)果: _id屬性 ObjectId('5c67c624332d6344f9ce55e4')是MongoDB在插入的過(guò)程中自動(dòng)添加的。 我們也可以直接根據(jù)ObjectId來(lái)查詢name為JOSIE的mygirlfriend集合數(shù)據(jù),這里需要使用bson庫(kù)里面的ObjectId。 from bson.objectid import ObjectId![]() 3.1find()方法來(lái)查詢mygirlfriend集合中的多條數(shù)據(jù)。 Ex:在這里查詢mygirlfriend集合中的查找hometown為SHENZHEN的數(shù)據(jù) ![]() 其返回結(jié)果是個(gè)Cursor類型?。。。ㄏ喈?dāng)于一個(gè)生成器) 我們需要把所有的結(jié)果遍歷取出即可!??! for result in results:![]() 如果要查詢查詢mygirlfriend集合中年齡大于24的數(shù)據(jù)要怎么寫呢? ![]() 在這里查詢的條件鍵值已經(jīng)不是單純的數(shù)字了,而是一個(gè)字典,其鍵名為比較符號(hào)$gt,意思是大于,鍵值為24,這樣便可以查詢出所有年齡大于24的數(shù)據(jù)。 在這里將比較符號(hào)歸納如下表: 符號(hào)含義示例 在這里,我們可以把數(shù)據(jù)轉(zhuǎn)換成pandas的DataFrame的數(shù)據(jù)格式打印出來(lái)。 result2 = pd.DataFrame(list(result1))![]() 四、count()方法計(jì)數(shù)和sort() 方法排序4.1 要統(tǒng)計(jì)查詢結(jié)果有多少條數(shù)據(jù),可以調(diào)用count()方法 如統(tǒng)計(jì)所有數(shù)據(jù)條數(shù): ![]() 查詢hometown為NEWYORK的數(shù)據(jù)條數(shù)! count = collection.find({'hometown': 'NEWYORK'}).count()![]() 4.2、sort() 方法排序 sort() 方法第一個(gè)參數(shù)為要排序的字段,第二個(gè)字段指定排序規(guī)則,1 為升序,-1 為降序,默認(rèn)為升序。 ![]() 五、偏移和更新操作5.1、偏移 在某些情況下我們可能想取某幾個(gè)元素可以利用skip()方法偏移幾個(gè)位置。 例如偏移2,就忽略前2個(gè)元素,得到第三個(gè)及以后的元素。 results = collection.find().sort('name').skip(2)![]() 5.2、更新操作 5.2.1、 update_one() 方法修改文檔中的記錄 第一個(gè)參數(shù)為查詢的條件 第二個(gè)參數(shù)為要修改的字段,需要使用newvalues = { '$set': { 'name': 'baby' } }這樣的形式 如果查找到的匹配數(shù)據(jù)多余一條,則只會(huì)修改第一條。 輸出修改后的集合 for x in collection.find():![]() 5.2.2、update_many() 方法修改文檔中的記錄 更改hometown為以 S 開(kāi)頭的文檔數(shù)據(jù)在mygirlfriend集合為hometown為HONGKONG ![]() 查看數(shù)據(jù)![]() 更新好了之后,我們?cè)賮?lái)隨意查一條數(shù)據(jù)#花式查詢![]() 六、如何用pymongo 刪除數(shù)據(jù)?6.1delete_many()方法刪除多條文檔 刪除所有 hometown字段中以 S 開(kāi)頭的文檔: delete_many()方法第一個(gè)參數(shù)為查詢對(duì)象,指定要?jiǎng)h除哪些數(shù)據(jù) ![]() 以 S 開(kāi)頭的文檔數(shù)據(jù)在mygirlfriend集合已經(jīng)刪除了 在這里使用了$regex來(lái)指定正則匹配, 在這里將一些功能符號(hào)再歸類如下: 符號(hào)含義示例示例含義 ![]() 6.2delete_one()方法刪除單個(gè)文檔 以下實(shí)例刪除 name 字段值為 'ROSE' 的文檔: myquery = { 'name': 'ROSE' }![]() 那么如何刪除集合中的所有文檔呢? delete_many()方法如果傳入的是一個(gè)空的查詢對(duì)象,則會(huì)刪除集合中的所有文檔: ![]() deleted_count屬性獲取刪除的數(shù)據(jù)條數(shù) 調(diào)用db.mygirlfriend.find()方法可以看到數(shù)據(jù)最后一條數(shù)據(jù)也被我們刪除了,mygirlfriend集合的數(shù)據(jù)已經(jīng)被我們刪光了。 ![]() 但是這個(gè)時(shí)候這個(gè)集合還是在的 ![]() 接著,我們調(diào)用collection.drop()方法即可刪除集合。 ![]() 上圖可以看到,mygirlfriend集合已經(jīng)被刪除啦!
![]() |
|
|