一.安裝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除以5余0 |
$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']
以列名去重返回的是一個該列名的列表,不會對數據庫有影響
- 數據庫的相關操作都推薦使用有_one和_many后綴的方法
- 上面只是簡單介紹了基礎操作,具體可查看官方文檔http://api.mongodb.com/python/current/api/pymongo/
