天天看點

python中pymongo庫用法詳解

MongoDB 是目前最流行的 NoSQL 資料庫之一,使用的資料類型 BSON(類似 JSON)。

pymongo

 提供了mongdb和python互動的所有方法.

pymongo官方文檔或源代碼:PyMongo — MongoDB Drivers

1、pymongo安裝

安裝方式:

pip install pymongo

2、pymongo連接配接資料庫

2.1 導入pymongo并選擇要操作的集合

資料庫和集合能夠自動建立

2.2 無需權限認證的方式建立連接配接對象以及集合操作對象

from pymongo import MongoClient

client = MongoClient(host,port) # 如果是本地連接配接host,port參數可以省略

collection = client[db名][集合名]
# collection = client.db名.集合名 # 與上邊用法相同
           

2.3 需要權限認證的方式建立連接配接對象以及集合操作對象

from pymongo import MongoClient

#  建立資料庫連接配接對象
client = MongoClient('host', 27017)

#  選擇一個資料庫
db = client['admin']
#  資料庫中開了權限認證後,需要下一行代碼
#  輸入超級管理者賬号和密碼
db.authenticate('python', 'python')
#  選擇一個集合,沒有的話會建立的
col = client['pydata']['test']
           
from pymongo import MongoClient

my_client = MongoClient('192.168.124.49:27017')
my_db = my_client['admin']
print(my_db)

my_db.authenticate('root', '88888888')

my_col = my_client['test-mongo']['test_col']
print(my_col)
           

也可以這樣寫:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)
           

3、建立資料庫

3.1 建立一個資料庫

        建立資料庫需要使用 MongoClient 對象,并且指定連接配接的 URL 位址和要建立的資料庫名。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
print(my_db)
           

運作結果:

python中pymongo庫用法詳解

注意: 在 MongoDB 中,資料庫隻有在内容插入後才會建立! 就是說,資料庫建立後要建立集合(資料表)并插入一個文檔(記錄),資料庫才會真正建立。

3.2 判斷資料庫是否已經存在

        可以讀取 MongoDB 中的所有資料庫,并判斷指定的資料庫是否存在。

 示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
# my_db = my_client['test-mongo']
# print(my_db)
db_list = my_client.list_database_names()
print(db_list)
if "test-mongo" in db_list:
    print('資料庫已經存在!')
           

運作結果:

python中pymongo庫用法詳解

注意:database_names 在最新版本的 Python 中已廢棄,Python3.7+ 之後的版本改為了 list_database_names()。

4、建立集合

        MongoDB 中的集合類似 SQL 的表。

4.1 建立一個集合

        MongoDB 使用資料庫對象來建立集合。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
print(my_db)

my_col = my_db['test_col']
print(my_col)
           

運作結果:

python中pymongo庫用法詳解

注意: 在 MongoDB 中,集合隻有在内容插入後才會建立! 就是說,建立集合(資料表)後要再插入一個文檔(記錄),集合才會真正建立。

注意:資料庫建立和集合建立後,需要在集合(資料表)中插入一個文檔(記錄),資料庫才會真正建立。

4.2 判斷集合是否已經存在

        可以讀取 MongoDB 資料庫中的所有集合,并判斷指定的集合是否存在。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

# my_col = my_db['test_col']
# print(my_col)

col_list = my_db.list_collection_names()
print(col_list)
if 'test_col' in col_list:
    print("集合已經存在!")
           

運作結果:

python中pymongo庫用法詳解

 注意:collection_names 在最新版本的 Python 中已廢棄,Python3.7+ 之後的版本改為了 list_collection_names()。

5、mongodb添加資料

        MongoDB 中的一個文檔類似 SQL 表中的一條記錄。

5.1 插入集合

        集合中插入文檔使用 insert_one() 方法,該方法的第一參數是字典鍵值對。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

dic = {'name': 'dgw', 'age': 26, 'sex': '男'}
data = my_col.insert_one(dic)
print(data)
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

5.2 傳回_id段

        insert_one() 方法傳回 InsertOneResult 對象,該對象包含 inserted_id 屬性,它是插入文檔的 id 值。

        如果在插入文檔時沒有指定 _id,MongoDB 會為每個文檔添加一個唯一的 id。

示例代碼1:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

dic = {'name': 'dgw2', 'age': 27, 'sex': '男'}
data = my_col.insert_one(dic)
print(data)
print(data.inserted_id)
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

示例代碼2:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

dic = {'_id': '666666', 'name': 'dgw2', 'age': 27, 'sex': '男'}
data = my_col.insert_one(dic)
print(data)
print(data.inserted_id)
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

5.3 插入多個文檔

        集合中插入多個文檔使用 insert_many() 方法,該方法的第一參數是字典清單。

        insert_many() 方法傳回 InsertManyResult 對象,該對象包含 inserted_ids 屬性,該屬性儲存着所有插入文檔的 id 值。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

col_list = [
    {'name': 'dgw1', 'age': 27, 'sex': '男'},
    {'name': 'dgw2', 'age': 26, 'sex': '男'},
    {'name': 'dgw3', 'age': 25, 'sex': '男'},
    {'name': 'dgw4', 'age': 28, 'sex': '男'}
]
data = my_col.insert_many(col_list)
print(data)
print(data.inserted_ids)
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

5.4 插入指定_id的多個文檔

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

col_list = [
    {'_id': '1', 'name': 'dgw1', 'age': 27, 'sex': '男'},
    {'_id': '2', 'name': 'dgw2', 'age': 26, 'sex': '男'},
    {'_id': '3', 'name': 'dgw3', 'age': 25, 'sex': '男'},
    {'_id': '4', 'name': 'dgw4', 'age': 28, 'sex': '男'}
]
data = my_col.insert_many(col_list)
print(data)
print(data.inserted_ids)
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

5.5 使用insert()插入文檔

        insert()可以批量的插入資料清單,也可以插入一條資料。

        inser()方法可能将會棄用!

文法結構如下:

collection.insert({一條資料})
collection.insert([{資料一},{資料二}])
           

示例代碼1:  【插入一條文檔】

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

doc = {'name': 'dgw', 'age': 27}
ret = my_col.insert(doc)
print(ret)
           

運作結果:

python中pymongo庫用法詳解

示例代碼2:  【插入多條文檔】

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

docs = [
    {'name': 'dgw', 'age': 27},
    {'name': 'dgw2', 'age': 26}
]
ret = my_col.insert(docs)
print(ret)
           

運作結果:

python中pymongo庫用法詳解

6、mongodb查詢資料

        MongoDB 中使用了 find 和 find_one() 方法來查詢集合中的資料,它類似于 SQL 中的 SELECT 語句。

接下來對test-mongo資料庫中的test-col集合中的資料進行查詢操作:

python中pymongo庫用法詳解

6.1 查詢一條資料

        使用 find_one() 方法來查詢集合中的一條資料。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

data = my_col.find_one()
print(data)
           

運作結果:

python中pymongo庫用法詳解

6.2 查詢集合中的所有資料

        find() 方法可以查詢集合中的所有資料,類似 SQL 中的 SELECT * 操作。

        傳回所有滿足條件的結果,如果條件為空,則傳回全部。結果是一個Cursor遊标對象,是一個可疊代對象,可以類似讀檔案的指針,但是隻能夠進行一次讀取。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

datas = my_col.find()
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

6.3 查詢指定字段的資料 

        使用 find() 方法來查詢指定字段的資料,将要傳回的字段對應值設定為 1。

        除了 _id,不能在一個對象中同時指定 0 和 1,如果你設定了一個字段為 0,則其他都為 1,反之亦然。

        注意:除了_id外,同時指定0和1會報錯。 

示例代碼1:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

datas = my_col.find({}, {'_id': 0, 'name': 1, 'age': 1})
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

示例代碼2:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

datas = my_col.find({}, {'name': 0})
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

6.4 根據指定條件查詢

        在 find() 中設定參數來過濾資料。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

query = {'name': 'dgw2'}
# query = {'_id': '2'}

datas = my_col.find(query)
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

6.5 進階查詢

        可以使用修飾符。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

# query = {'_id': {'$gt': '2'}}
# query = {'age': {'$gte': 27}}
query = {'name': {'$gte': 'dgw3'}}
# query = {'_id': '2'}

datas = my_col.find(query)
print(datas)
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

6.6 使用正規表達式$regex

        正規表達式修飾符隻用于搜尋字元串的字段。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

# query = {'name': {'$regex': '^d'}}
query = {'name': {'$regex': '3$'}}

datas = my_col.find(query)
print(datas)
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

6.7 傳回指定條數記錄limit()

        對查詢結果設定指定條數的記錄可以使用 limit() 方法,該方法隻接受一個數字參數。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

datas = my_col.find().limit(3)
print(datas)
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

6.8 指定從哪條資料開始skip()

        對查詢結果設定指定開始位置查詢可以使用 skip() 方法,該方法隻接受一個數字參數。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

datas = my_col.find().skip(3)
print(datas)
for data in datas:
    print(data)

print("*" * 100)

datas2 = my_col.find().skip(3).limit(3)
print(datas2)
for data in datas2:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

6.9 排序sort()

        sort() 方法可以指定升序或降序排序。

        sort() 方法第一個參數為要排序的字段,第二個字段指定排序規則,1 為升序,-1 為降序,預設為升序。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

document = my_col.find().sort('age', -1)
for doc in document:
    print(doc)
           

運作結果:

python中pymongo庫用法詳解

7、mongodb修改資料

接下來對test-mongo資料庫中的test-col集合中的資料進行修改操作:

python中pymongo庫用法詳解

7.1 使用update_one()修改一條資料

        使用 update_one() 方法修改文檔中的記錄。該方法第一個參數為查詢的條件,第二個參數為要修改的字段。

        如果查找到的比對資料多于一條,則隻會修改第一條。

        update_one()是局部更新替換,隻需要替換更新需要修改的字段即可。

示例代碼1:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

query = {'_id': '1', 'name': 'dgw1'}
new_value = {'$set': {'age': 21}}

my_col.update_one(query, new_value)

datas = my_col.find()
for data in datas:
    print(data)
           

運作結果:

python中pymongo庫用法詳解

示例代碼2: 【使用db.update_one()更新一條資料】

from pymongo import MongoClient
 
client = MongoClient('127.0.0.1', 27017)
 
db = client['python_test']['students']
# print(db)
for data in db.find():
    print(data)
    print(data.values())
 
# 隻需要放需要更新的字段,注意使用$進行操作
doument = {"$set": {'stu_no': 666666, 'age': 25}}
db.update_one({'stu_name': '張三'}, doument, upsert=True)
for data in db.find():
    print(data)
           

運作結果:

python中pymongo庫用法詳解

示例代碼3:【使用update_one()時,對于不存在的字段是直接添加,存在的字段是更新】

# Requires pymongo 3.6.0+
from pymongo import MongoClient

client = MongoClient("mongodb://root:[email protected]:27017")
database = client["test-mongo"]
collection = database["test_col"]

# Created with Studio 3T, the IDE for MongoDB - https://studio3t.com/

query = {}

cursor = collection.find(query)
update_value = {'$set': {'address': '北京市朝陽區', 'career': '程式員'}}
try:
    for doc in cursor:
        print(doc)
        # collection.update_one(doc, update_value)
        collection.update_one({'_id': doc['_id']}, update_value)
finally:
    client.close()

print("*" * 100)

cursor = collection.find(query)
try:
    for doc in cursor:
        print(doc)
finally:
    client.close()
           

運作結果:

python中pymongo庫用法詳解

7.2 使用replace_one()修改一條資料

示例代碼:

from pymongo import MongoClient
 
client = MongoClient('127.0.0.1', 27017)
 
db = client['python_test']['students']
# print(db)
for data in db.find():
    print(data)
    print(data.values())
 
# replace_one要求是所有資料,少一個key-value則報錯
doument = {'stu_no': 3790567, 'stu_name': '張三', 'address': '山東省青島市', 'phone_no': '12345678910', 'age': 26}
db.replace_one({'stu_name': '張三'}, doument, upsert=True)
for data in db.find():
    print(data)
           

運作結果:

python中pymongo庫用法詳解

7.3 使用update_many()修改多條資料

        update_many()是局部更新替換,隻需要替換更新需要修改的字段即可。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

# query = {'name': {'$regex': '^d'}}
query = {'name': 'dgw1'}
new_value = {'$set': {'age': 23}}

num = my_col.update_many(query, new_value)

datas = my_col.find()
for data in datas:
    print(data)

print(f"已經更新{num.matched_count}條文檔!")
           

運作結果:

python中pymongo庫用法詳解

7.4 使用update()方法

        update()更新資料(全文檔覆寫或指定鍵值,更新一條或多條)。

        update()方法将會被棄掉,使用update_one()、update_many()和replace_one()取代。

文法結構:

collection.update({條件}, {'$set':{指定的kv或完整的一條資料}}, multi=False/True, upsert=False/True)
           

參數說明:

  • multi參數:預設為False,表示更新一條; multi=True則更新多條。
  • multi參數必須和$set一起使用
  • upsert參數:預設為False,upsert=True則先查詢是否存在,存在則更新;不存在就插入
  • $set表示指定字段進行更新

示例代碼1:  【插入一條資料】【存在就更新,不存在就插入】

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

doc = {"age": 36}
ret = my_col.update({'_id': '2'}, {"$set": doc}, upsert=True)
print(ret)
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

示例代碼2:  【插入多條資料】【存在就更新,不存在就插入】

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

doc = {"age": 35}
ret = my_col.update({'name': 'dgw2'}, {"$set": doc}, multi=True, upsert=True)
print(ret)
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

8、mongodb删除資料

接下來對test-mongo資料庫中的test-col集合中的資料進行删除操作:

python中pymongo庫用法詳解

8.1 删除單個文檔

        使用 delete_one() 方法來删除一個文檔,該方法第一個參數為查詢對象,指定要删除哪些資料。

        如果查詢到多條資料,隻會删除查詢到的第一條資料。

示例代碼1:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

query = {'_id': '1', 'name': 'dgw1'}
my_col.delete_one(query)

document = my_col.find()
for doc in document:
    print(doc)
           

運作結果:

python中pymongo庫用法詳解

示例代碼2:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

query = {'name': 'dgw2'}
my_col.delete_one(query)

document = my_col.find()
for doc in document:
    print(doc)
           

運作結果:

python中pymongo庫用法詳解

8.2 删除多個文檔資料

        使用 delete_many() 方法來删除多個文檔,該方法第一個參數為查詢對象,指定要删除哪些資料。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

# query = {'name': {'$regex': '^d'}}
query = {'name': 'dgw2'}
num = my_col.delete_many(query)

document = my_col.find()
for doc in document:
    print(doc)

print(f"{num.deleted_count}個文檔已經被删除!")
           

運作結果:

python中pymongo庫用法詳解

8.3 删除集合中的所有文檔

        delete_many() 方法如果傳入的是一個空的查詢對象,則會删除集合中的所有文檔:

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

num = my_col.delete_many({})

document = my_col.find()
for doc in document:
    print(doc)

print(f"{num.deleted_count}個文檔已經被删除!")
           

運作結果:

python中pymongo庫用法詳解
python中pymongo庫用法詳解

8.4 删除集合 

        使用 drop() 方法來删除一個集合。

示例代碼:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

my_col.drop()
           

參考博文:

Python MongoDB | 菜鳥教程

Python Mongodb 插入文檔 | 菜鳥教程

Python Mongodb 查詢文檔 | 菜鳥教程

Python Mongodb 修改文檔 | 菜鳥教程

Python MongoDB 排序 | 菜鳥教程

Python Mongodb 删除資料 | 菜鳥教程

附錄:

添加資料:

from pymongo import MongoClient

my_client = MongoClient('mongodb://root:[email protected]:27017')
my_db = my_client['test-mongo']
# print(my_db)

my_col = my_db['test_col']
# print(my_col)

col_list = [
    {'name': 'dgw1', 'age': 27, 'sex': '男'},
    {'name': 'dgw2', 'age': 26, 'sex': '男'},
    {'name': 'dgw3', 'age': 25, 'sex': '男'},
    {'name': 'dgw4', 'age': 28, 'sex': '男'},
    {'_id': '1', 'name': 'dgw1', 'age': 27, 'sex': '男'},
    {'_id': '2', 'name': 'dgw2', 'age': 26, 'sex': '男'},
    {'_id': '3', 'name': 'dgw3', 'age': 25, 'sex': '男'},
    {'_id': '4', 'name': 'dgw4', 'age': 28, 'sex': '男'}
]
# 插入多條資料
data = my_col.insert_many(col_list)
print(data)
print(data.inserted_ids)