MongoDB的安裝與python操作MongoDB


一.安裝MongoDB

因為我個人使用的是windows,就只記錄下windows下的安裝

1.下載安裝

就是官網,下載msi,選個路徑安裝

2.配置

看見別的地方說需要手動在bin同級目錄創建data和log文件夾,我安裝時它們是自動生成的
在data文件夾中建個專門存數據的文件夾db,
在log文件夾中建個mongodb.log文件來保存日志
然后以管理員身份啟動cmd
cd到MongoDB的bin目錄下
在命令行輸入

mongod --bind_ip 0.0.0.0 --logpath "D:\mongodb\log\mongodb.log" --logappend --dbpath "D:\mongodb\data\db" --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install

這個命令相當於綁定ip,端口,一些路徑到系統服務中,上面的路徑是自己電腦的路徑,運行完沒報錯應該就是成功了
結果。。。我去任務管理器發現服務狀態是停止,也啟動不了,說服務沒有及時響應啟動或控制請求
然后我又用了另一個方法
我先把MongoDB卸載了,然后裝的時候沒有按默認的啟動服務(我想之前沒准就是裝的時候默認啟動了服務的問題)
然后把bin目錄下的內容全部拷貝到bin的同級目錄下(為了方便)
之后在同級目錄下創建data和log文件夾
再建立mongod.conf文件,內容為

systemLog:
   destination: file
   path: log\mongo.log
   logAppend: true
storage:
   dbPath: data
net:
   bindIp: 127.0.0.1

然后在cmd此目錄下執行D:\mongodb>mongod.exe —config mongod.conf
執行完后會什么也沒顯示,那沒准也是成功了。。。可是我又去系統服務里看了下。。。沒有服務
我想剛才嘗試第一種方案時不是有了服務嘛,我又按照之前輸入的命令並按照現在的配置又試了一下,就下邊這個命令,注意要以管理員身份執行

mongod --bind_ip 127.0.0.1 --logpath "D:\mongodb\log\mongo.log" --logappend --dbpath "D:\mongodb\data" --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install

運行完之后任務管理器的服務里果然有了,我右鍵啟動了它,成功
又在之前的目錄下執行mongo,連接成功
終於MongoDB安裝完成。
我發現數據庫的安裝真的好復雜,容易出錯,之前安裝mysql的時候就困擾了好久。。。

3.RoboMongo

一個圖形化管理工具,使用起來很容易
下載頁面為https://robomongo.org/download

二.python操作MongoDB

1.pymongo

pip install pymongo就行

2.連接MongoDB


import pymongo

client=pymongo.MongoClient('mongodb://用戶名:密碼@服務器IP或域名:端口號')

如果沒有設置權限驗證,並且數據庫在本機那可以像下邊這樣


client=pymongo.MongoClient('mongodb://localhost:27017')

也可以


client=pymongo.MongoClient(host='localhost',port=27017)

2.創建與指定數據庫

有兩種方式
第一種:


db2=client.test1

第二種:


db1=client['test1']

很顯然是第二種好,因為第二種的數據庫名能當變量傳遞進去,第一個只能手動輸入
這里如果有叫test1的數據庫,那么就得到這個數據庫對象,如果沒有,就創建它並得到它

3.創建與指定集合

集合為數據庫的下一級,就類比為關系數據庫的表
它的創建與指定也有兩種方式:


collection1=db1['test1_collection']
collection2=db1.test2_collection

跟數據庫的指定類似

4.插入數據

第一種方法:
插入一條數據

data={'name':'sfencs','age':20,'hobby':'coding'}
result=collection1.insert(data)
print(result)#5c23a135080b3347b8a0038c

把字典傳入insert方法中
返回的是數據庫自動生成的ObjectId,它應該是隨時間而增加的

插入多條數據

data=[{'name':'sfencs','age':20,'hobby':'coding'},{'name':'tom','age':30,'hobby':'playing'}]
result=collection1.insert(data)
print(result)#[ObjectId('5c23a210080b331d546543ca'), ObjectId('5c23a210080b331d546543cb')]

insert傳入的是由字典組成的列表

第一種方式已經不推薦使用了,雖然能使用,但在使用時也會出現警告:
DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead.
result=collection1.insert(data)

第二種方法:

向上面的警告中,提示我們用insert_one or insert_many instead

插入一條數據

data={'name':'sfencs','age':20,'hobby':'coding'}
result=collection1.insert_one(data)
print(result)#<pymongo.results.InsertOneResult object at 0x000001ED171FE488>
print(result.inserted_id)#5c23a406080b33164cb4486c

傳入的依然是字典,返回的是一個InsertOneResult對象,它有inserted_id屬性

插入多條數據

data=[{'name':'sfencs','age':20,'hobby':'coding'},{'name':'tom','age':30,'hobby':'playing'}]
result=collection1.insert_many(data)
print(result)# <pymongo.results.InsertManyResult object at 0x000002B3B4B71D08>
print(result.inserted_ids)# [ObjectId('5c23a4a8080b33197c17cb0e'), ObjectId('5c23a4a8080b33197c17cb0f')]

傳入的是字典列表,返回的是InsertManyResult對象,它有inserted_ids屬性

5.查詢

查詢一條數據

用find_one方法


result=collection1.find_one({'name':'sfencs'},{'_id':0,'age':0})
print(result)# {'name': 'sfencs', 'hobby': 'coding'}

返回的是一個字典,find_one的第一個參數是一個字典,表示name是sfencs的約束條件,第二個參數是返回的字段,也是一個字典
這個第二個參數字典的鍵為屬性,值為0或1,0表示不返回,1表示返回,所以只需要標明要返回的,或只標明不返回的就行,兩個都寫就要報錯了,但是有一個例外就是數據庫默認生成的_id屬性,它如果不標明的話,默認是都返回的,只有主動標明0才不返回
除此之外還可以直接根據_id來唯一查找,這時需要引入一個模塊,如下:


from bson.objectid import ObjectId

result=collection1.find_one({'_id':ObjectId('5c23a4a8080b33197c17cb0e')})
print(result)# {'_id': ObjectId('5c23a4a8080b33197c17cb0e'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'}
查詢多條數據

使用find方法


result=collection1.find({'name':'sfencs'})
print(result)# <pymongo.cursor.Cursor object at 0x00000177A0A77CF8>
for i in result:
    print(i)
''' {'_id': ObjectId('5c239d86080b334ef0cd5773'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'} {'_id': ObjectId('5c239eaa080b3308b8224413'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'} {'_id': ObjectId('5c23a135080b3347b8a0038c'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'} {'_id': ObjectId('5c23a210080b331d546543ca'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'} {'_id': ObjectId('5c23a3eb080b334cbc693608'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'} {'_id': ObjectId('5c23a406080b33164cb4486c'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'} {'_id': ObjectId('5c23a4a8080b33197c17cb0e'), 'name': 'sfencs', 'age': 20, 'hobby': 'coding'} '''

返回的是Cursor類型,相當於一個生成器,每一個結果都是一個字典

邏輯查詢條件

像剛才的只是固定的條件,還有一些更多可選條件

 符號 | 實例 | 含義 |
 $lt      | {'age':{'$lt':15}}                 | 年齡小於15                  |
 $gt      | {'age':{'$gt':15}}                 | 年齡大於15                  |
 $lte      | {'age':{'$lte':15}}                | 小於等於                    |
 $gte      | {'age':{'$gte':15}}                | 大於等於                    |
 $ne      | {'age':{'$ne':15}}                 | 不等於                      |
 $in      | {'age':{'$in':[15,20]}}            | 在范圍內                    |
 $nin      | {'age':{'$nin':[15,20]}}           | 不在范圍                    |
 $regex     | {'name':{'$regex':'^s.*'}}         | 正則表達式                  |
 $exist     | {'name':{'$exist':True}}           | name屬性存在                |
 $type      | {'age':{'$type':'int'}}            | age類型為int                |
 $mod       | {'age':{'$mod':[5,0]}}             | age除以50                 |
 $text      | {'$text':{'$search':'aaa'}}        | text類型的屬性中包含aaa     |
 $where     | {'$where':'obj.name==obj.age'}     | 高級查詢                    |

如果查詢條件有多個,可以在字典中放多個鍵值對

6.排序


result=collection1.find({'name':'sfencs'}).sort('_id',-1)

sort第一個參數是參照的屬性,第二個參數為1時是升序,為-1時是降序

7.計數


result=collection1.find({'name':'sfencs'}).count()
print(result)# 7

8.偏移

偏移用來從得到的跳過前幾個元素


result=collection1.find({'name':'sfencs'}).skip(3)

for i in result:
    print(i)

上邊這樣就會跳過前三個元素
我們也可以限定出來的元素的個數


result=collection1.find({'name':'sfencs'}).skip(3).limit(2)

這樣就跳過了3個並取兩個

9.修改

修改也有兩種方式
一種是使用update方法,這種同樣也不被推薦使用了
我們應該使用update_one,update_many方法

修改一條數據

people=collection1.find_one({'name':'sfencs'})
people['age']=15
result=collection1.update_one({'name':'sfencs'},{'$set':people})
print(result)# <pymongo.results.UpdateResult object at 0x000002714AD7E508>
print(result.matched_count,result.modified_count)#1 1

上面這種方式是先找出來,然后把字典改了,然后再替換掉原來存的document,也就是數據庫里的一個字典
返回值是一個UpdateResult對象,它的matched_count屬性是匹配的條數,modified_count是影響的條數
update第一個參數是和查詢的第一個參數一樣
還可以用下面這種方法


result=collection1.update_one({'name':'sfencs'},{'$set':{'age':16}})
print(result)
print(result.matched_count,result.modified_count)

這樣的意思是直接把年齡設置為16,其他的不做改動

修改多條數據

result=collection1.update_many({'name':'sfencs'},{'$set':{'age':16}})
print(result)
print(result.matched_count,result.modified_count)# 7 ,6

和修改一條數據的第二種方法差不多,因為里邊有一個本來就是age=16了,所以影響條數比匹配條數少一
還可以使指定數據自增


result=collection1.update_many({'name':'sfencs'},{'$inc':{'age':2}})
print(result)
print(result.matched_count,result.modified_count)# 7 ,7

這樣使所有的年齡都增加了2

10.刪除

刪除依然有兩種方法

第一種

result=collection1.remove({'age':22})
print(result)# {'n': 1, 'ok': 1.0}

直接刪除指定條件的文檔

第二種

result=collection1.delete_one({'age':30})
print(result.deleted_count)# 1

delete_one是刪除一條,返回值是一個DeleteResult對象,具有deleted_count屬性


result=collection1.delete_many({'age':18})
print(result.deleted_count)# 6

這個是刪除多條數據

11.去重


result=collection1.distinct('name')
print(result)# ['tom', 'sfencs']

以列名去重返回的是一個該列名的列表,不會對數據庫有影響



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM