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_count和modified_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。