用Python操作MongoDB(pymongo)


MongoDB簡介(摘自:http://www.runoob.com/mongodb/mongodb-intro.html

MongoDB 由C++語言編寫,是一個基於分布式文件存儲的開源數據庫系統。

MongoDB 將數據存儲為一個文檔,數據結構由鍵值對(key=>value)組成,類似於 JSON 對象。

MongoDB 屬於NoSQL,NoSQL即Not Only SQL,意思是"不僅僅是SQL",泛指非關系型數據庫。

(關系數據庫管理系統(RDBMS)與非關系型數據庫(NoSQL)之間的區別請見:https://www.cnblogs.com/HuZihu/p/10233242.html

 

MongoDB的一些基本術語

SQL術語/概念 MongoDB術語/概念 解釋/說明
database database 數據庫
table collection 數據庫表/集合
row document 數據記錄行/文檔
column field 數據字段/域
index index 索引
table joins   表連接,MongoDB不支持
primary key primary key 主鍵,MongoDB自動將_id字段設置為主鍵

 

使用Python操作MongoDB

接下來我們用python來操作MongDB,首先需要安裝PyMongo庫(pip install pymongo)。

 

連接MongoDB

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

注:

host為指定的連接服務器的地址,設置為'localhost'代表連接到本地的MongoDB服務上

port為指定的端口,如果不填,默認為27017

 

查看MongoDB中的所有數據庫

dblist=client.list_database_names()

結果顯示現有3個數據庫:

['admin', 'config', 'local']

 

創建或指定數據庫

db=client['HuziHu']

(注:在MongoDB中,數據庫只有在內容插入后才會創建)

 

創建或指定集合:(集合類似於關系型數據庫中的表格)

collection=db['Xiaoyugan']

(注:在MongoDB中,集合只有在內容插入后才會創建)

 

查看指定數據庫中的所有集合

collist=db.list_collection_names()

 

插入數據:(我們可以自行指定每條數據的id--"_id";如果我們在插入數據時沒有指定 _id,那么MongoDB 會為每條數據添加一個唯一的id。)

插入單條數據:insert_one()

yugan={"Name":"Xiaoyugan", "Type":"001", "Flavor":"Spicy","Num":4,"Comment":"Don\'t like it.Too hot!"}
collection.insert_one(yugan)

注:insert_one()方法返回InsertOneResult對象,該對象包含 inserted_id 屬性,它是插入數據的id值。

 

插入多條數據:insert_many()

yugan=[{"Name":"Xiaoyugan", "Type":"001", "Flavor":"Spicy","Num":4,"Comment":"Don\'t like it.Too hot!"},
       {"Name":"Xiaoyugan", "Type":"002", "Flavor":"Sweet","Num":2,"Comment":"Don\'t like it.Too sweet!"},
       {"Name":"Xiaoyugan", "Type":"004", "Flavor":"Fish","Num":16,"Comment":"liked it."}]
collection.insert_many(yugan)

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

 

查看數據的id值:xx.inserted_id(對於單條數據)

                            xx.inserted_ids(對於多條數據)

 

查看指定集合中的所有數據:

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

 

查詢數據:

查詢單條數據:find_one(...)   ---返回符合查詢條件的第一條結果,如果沒有符合查詢條件的結果,那么返回None

query={"Type":"004"}

print(collection.find_one(query))

結果:

{'_id': ObjectId('5c330ea47eb8d621f8d0a351'), 'Name': 'Xiaoyugan', 'Type': '004', 'Flavor': 'Fish', 'Num': 16, 'Comment': 'liked it.'}

 

查詢所有數據:find(...)   ---返回符合查詢條件的所有結果,如果沒有符合查詢條件的結果,那么返回None

query={"Type":"004"}

for i in collection.find(query):
    print(i)

結果:

{'_id': ObjectId('5c330ea47eb8d621f8d0a351'), 'Name': 'Xiaoyugan', 'Type': '004', 'Flavor': 'Fish', 'Num': 16, 'Comment': 'liked it.'}
{'_id': ObjectId('5c330f6e7eb8d621f8d0a355'), 'Name': 'Xiaoyugan', 'Type': '004', 'Flavor': 'Fish', 'Num': 16, 'Comment': 'liked it.'}
{'_id': ObjectId('5c330f857eb8d621f8d0a359'), 'Name': 'Xiaoyugan', 'Type': '004', 'Flavor': 'Fish', 'Num': 16, 'Comment': 'liked it.'}

 

查詢條件可以使用修飾符:

符號

含義

語法

$lt

小於

{field: {'$lt': value} }

$gt

大於

{field: {'$gt': value} }

$lte

小於等於

{field: {'$lte': value} }

$gte

大於等於

{field: {'$gte': value} }

$ne

不等於

{field: {'$ne': value} }

$in

在范圍內

{field: {'$in': [ <value1>, <value2> ... <valueN> ]} }

$nin

不在范圍內

{ field: { '$nin': [ <value1>, <value2> ... <valueN> ]} }

$and

 { '$and': [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

$or

 或

 { '$or': [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

$not

 不是

 { field: { '$not': { <operator-expression> } } }

 

此外,查詢還可以使用一些功能符號:

符號

含義

示例

示例含義

$regex

匹配正則表達式

{'name': {'$regex': '^M.*'}}

name以M開頭

$exists

屬性是否存在

{'name': {'$exists': True}}

name屬性存在

$type

類型判斷

{'age': {'$type': 'int'}}

age的類型為int

$mod

數字模操作

{'age': {'$mod': [5, 0]}}

年齡模5余0

$text

文本查詢

{'$text': {'$search': 'Mike'}}

text類型的屬性中包含Mike字符串

$expr

使用聚合表達式

{ '$expr': {'$gt':['$fans_count', '$follows_count']} }

粉絲數大於關注數

 

對查詢條件更多的說明請見官方文檔:https://docs.mongodb.com/manual/reference/operator/query/

 

限制返回查詢結果的條數:limit(...)

query={"Comment":{"$regex":"^Don"}}

for i in collection.find(query).limit(2):
    print(i)

結果:

{'_id': ObjectId('5c330d667eb8d621f8d0a34d'), 'Name': 'Xiaoyugan', 'Type': '001', 'Flavor': 'Spicy', 'Num': 4, 'Comment': "Don't like it.Too hot!"}
{'_id': ObjectId('5c330ea47eb8d621f8d0a34f'), 'Name': 'Xiaoyugan', 'Type': '001', 'Flavor': 'Spicy', 'Num': 4, 'Comment': "Don't like it.Too hot!"}

 

統計查詢結果的條數:count_documents(...)

query={"Type":"004"}

print(collection.count_documents(query))

 

對查詢結果進行排序:sort(...)

for i in collection.find().sort('Num', pymongo.ASCENDING):
    print(i)

注:pymongo.ASCENDING為升序,pymongo.DESCENDING為降序。

 

更新數據:

更新單條數據: update_one(..., ...)   --- 修改符合查詢條件的第一條數據

query={'Flavor': 'Spicy'}
newvalue={"Flavor":"Hot"}

collection.update_one(query,{'$set':newvalue})

 

更新多條數據: update_many(..., ...)   --- 修改符合查詢條件的所有數據

query={}
newvalue={'Num':1}

collection.update_many(query,{'$inc': newvalue})

注:返回結果是UpdateResult類型,分別調用matched_countmodified_count屬性,可以獲得匹配的數據條數和影響的數據條數。

 

一些常用的更新操作符:

符號

含義

$rename

重新命名字典的鍵

$set

設置字典的值

$unset

去除字典的鍵

$inc

增加字典的值

$setOnInsert

對已有的數據不更新,只插入原本不存在的數據

 

刪除數據:

刪除單條數據: delete_one(...)   --- 刪除符合查詢條件的第一條數據

 

刪除多條數據: delete_many(...)   --- 刪除符合查詢條件的所有數據

from bson.objectid import ObjectId

collection.delete_many({'_id':{'$gt':ObjectId('5c330f857eb8d621f8d0a359')}})

刪除_id大於ObjectId('5c330f857eb8d621f8d0a359')的數據。

 

注:

刪除數據返回的結果都是DeleteResult類型,可以調用deleted_count屬性獲取刪除數據的條數。

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

 

對集合重新命名: rename()

collection.rename('Yu')

 

刪除集合:

collection.drop()

 

刪除數據庫:

client.drop_database('HuziHu')

 

對集合的更多操作可參見官方文檔:http://api.mongodb.com/python/current/api/pymongo/collection.html

 


免責聲明!

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



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