python操作MongoDB數據庫


上一篇文章中介紹了怎么用python連接MongoDB數據庫,現在寫一下python控制MongoDB進行增刪改查操作。

首先連接數據庫:

import  pymongo
# 連接數據庫
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydb"]
mycol = mydb["col"]

Python MongoDB增加數據

插入一條記錄:

x=mycol.insert_one({"name":"劉飛","age":19})
print(x)

輸出結果:

<pymongo.results.InsertOneResult object at 0x02A45620>

insert_one() 方法返回 InsertOneResult 對象,可使用下面方法查看對象所有的屬性:

x=mycol.insert_one({"name":"劉飛","age":19})
print(dir(x))
#輸出結果 [
'_InsertOneResult__acknowledged', '_InsertOneResult__inserted_id', '_WriteResult__acknowledged', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_raise_if_unacknowledged', 'acknowledged', 'inserted_id']

該對象包含 inserted_id 屬性,它是插入文檔的 id 值。如果我們在插入文檔時沒有指定 _id,MongoDB 會為每個文檔添加一個唯一的 id

x=mycol.insert_one({"name":"劉飛","age":19})
print(x.inserted_id)
#輸出結果 5d43d8189f5e382760e25acf

插入多個文檔:

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

mylist = [
  { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
  { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
  { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
  { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
  { "name": "Github", "alexa": "109", "url": "https://www.github.com" }
]
x = mycol.insert_many(mylist)
 
# 輸出插入的所有文檔對應的 _id 值
print(x.inserted_ids)

#輸出結果
[ObjectId('5d43d9069f5e38272c69fc07'), ObjectId('5d43d9069f5e38272c69fc08'), ObjectId('5d43d9069f5e38272c69fc09'), ObjectId('5d43d9069f5e38272c69fc0a'), ObjectId('5d43d9069f5e38272c69fc0b')]

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

執行完以上查找,我們可以在命令終端,查看數據是否已插入:

插入指定id的多個文檔:

#先刪除之前插入的所有文檔
x=mycol.delete_many({})
print(x.deleted_count, "個文檔已刪除")
#輸出結果 11 個文檔已刪除
mylist = [
    {"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥教程"},
    {"_id": 2, "name": "Google", "address": "Google 搜索"},
    {"_id": 3, "name": "Facebook", "address": "臉書"},
    {"_id": 4, "name": "Taobao", "address": "淘寶"},
    {"_id": 5, "name": "Zhihu", "address": "知乎"}
]

x = mycol.insert_many(mylist)

# 輸出插入的所有文檔對應的 _id 值
print(x.inserted_ids)

#輸出結果
[1, 2, 3, 4, 5]

執行完以上查找,我們可以在命令終端,查看數據是否已插入:

 

 Python MongoDB 刪除數據

 刪除單個文檔:

我們可以使用 delete_one() 方法來刪除一個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。

本文使用的測試數據如下:

 

x=mycol.delete_one({"name":"Google"})
print(x.deleted_count,'個文檔已刪除')

#輸出結果
1 個文檔已刪除

刪除多個文檔:

我們可以使用 delete_many() 方法來刪除多個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。

刪除所有 name 字段中以 F 開頭的文檔:

myquery = {"name": {"$regex": "^F"}}
x = mycol.delete_many(myquery)
print(x.deleted_count, "個文檔已刪除")

#輸出結果
2 個文檔已刪除

刪除集合中所有的文檔:

x = mycol.delete_many({})
print(x.deleted_count, "個文檔已刪除")

#輸出結果
7 個文檔已刪除

刪除集合:

mycol.drop()

如果刪除成功 drop() 返回 true,如果刪除失敗(集合不存在)則返回 false。

我們使用以下命令在終端查看集合是否已刪除:

Python MongoDB 修改文檔

修改一條記錄

在 MongoDB 中使用 update_one() 方法修改文檔中的記錄。該方法第一個參數為查詢的條件,第二個參數為要修改的字段。如果查找到的匹配數據多余一條,則只會修改第一條。

 本文使用的測試數據如下

將 alexa 字段的值 10000 改為 12345:

mycol.update_one({"alexa":'100'},{'$set':{"alexa":"123456"}})
for i in mycol.find():
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}

修改多條記錄

使用 update_many()。查找所有以 F 開頭的 name 字段,並將匹配到所有記錄的 alexa 字段修改為 123

x=mycol.update_many({"name":{"$regex":"^F"}},{"$set":{"alexa":"123"}})
print(x.modified_count,'個文檔已修改')

#輸出結果
1 個文檔已修改

Python MongoDB 查詢文檔

MongoDB 中使用了 find 和 find_one 方法來查詢集合中的數據,它類似於 SQL 中的 SELECT 語句。

本文使用的測試數據如下

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

x = mycol.find_one()
print(x)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}

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

for i in mycol.find():
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}

查詢指定字段的數據

我們可以使用 find() 方法來查詢指定字段的數據,將要返回的字段對應值設置為 1。

for i in mycol.find({},{"_id":0,"name":1,"url":1}):
    print(i)

#輸出結果
{'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'name': 'QQ', 'url': 'https://www.qq.com'}
{'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'name': '知乎', 'url': 'https://www.zhihu.com'}
{'name': 'Github', 'url': 'https://www.github.com'}

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

以下實例除了 alexa 字段外,其他都返回:

for i in mycol.find({},{"alexa":0}):
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'url': 'https://www.github.com'}

以下代碼同時指定了 0 和 1 則會報錯

for i in mycol.find({},{"alexa":0,"name":1}):
    print(i)

#報錯信息
pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.

根據指定條件查詢

在 find() 中設置參數來過濾數據。查找 name 字段為 "QQ" 的數據:

mydoc = mycol.find({"name":"QQ"})
for i in mydoc:
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}

高級查詢

查詢的條件語句中,我們還可以使用修飾符。

讀取 name 字段中第一個字母 ASCII 值大於 "H" 的數據,大於的修飾符條件為 {"$gt": "H"} :

mydoc = mycol.find({"name":{"$gt":"H"}})
for i in mydoc:
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}

使用正則表達式查詢

正則表達式修飾符只用於搜索字符串的字段。

讀取 name 字段中第一個字母為 "T" 的數據,正則表達式修飾符條件為 {"$regex": "^T"} :

mydoc = mycol.find({"name":{"$regex":"^T"}})
for i in mydoc:
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}

返回指定條數記錄

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

mydoc = mycol.find().limit(3)
for i in mydoc:
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}

排序

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

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

對字段 alexa 按升序排序:

mydoc = mycol.find().sort('alexa')
for i in mydoc:
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}

對字段 alexa 按降序排序:

mydoc = mycol.find().sort('alexa',-1)
for i in mydoc:
    print(i)

#輸出結果
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}

 

done

參考資料:https://www.runoob.com/python3/python-mongodb.html


免責聲明!

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



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