本教程適合于mongodb的創建/查詢/和基本的案例操作
注:未經許可不得轉載
一、配置和安裝相應的環境
主要針對python腳本操作mongdb數據庫,所以安裝pymongo和mongodb庫。安裝教程請谷歌;
二、創建連接到mongodb數據庫:
與PyMongo工作時,第一步是建立一個MongoClient到正在運行的mongod實例。
>>>from pymongo import MongoClient
>>>client = MongoClient('localhost', 27017)#比較常用
>>># client = MongoClient('mongodb://localhost:27017/')使用MongoDB的URI格式
創建常見的方式有兩種:一種是連接到默認的主機端口;另外一種是指定主機和固定的端口,注意一般mongodb安裝時默認的端口為:27017。
三、創建數據庫
MongoDB中的單個實例可以支持多個獨立的數據庫。當PyMongo工作訪問使用上MongoClient實例屬性的風格訪問數據庫:例如創建一個test_database數據庫。
>>>db = client.test_database
>>># db = client['test-database']或者這種形式
>>>#test_database數據庫的名稱
四、獲取集合(getting a collection)
集合是一組存儲在MongoDB中的文件,并且可以被認為是一個表,作為大致在關系數據庫中的等效的。獲得在PyMongo收集工作與獲取數據庫:
>>>collection = db.test_collection
>>># collection = db['test-collection']或者這種形式
有關集合(和數據庫)在MongoDB中一個重要的注意的是:當第一個文件被插入到他們集合和數據庫時集合就被創建。
五、文件
MongoDB中的數據是使用JSON風格的文件代表(和存儲)。在PyMongo我們用字典來代表文件。作為一個例子,下面的字典可能被用來代表一個博客帖子,下面以一個例子來說明文件的寫入mongodb的過程:
文件的內如如下:
>>> import datetime
>>> post = {"author": "Mike",
..."text":"My first blog post!",
..."tags":["mongodb", "python", "pymongo"],
..."date":datetime.datetime.utcnow()}
Note:請注意,文檔可以包含原生的Python類型(如datetime.datetime實例),它會自動轉換,并從相應的BSON類型。
5.1文件的插入
若要將文檔轉換為集合,可以使用insert_one()函數進行:
>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
Out[5]: ObjectId('56556b3c9d00010b2f8909cf')
當一個文件被插入一個特殊的鍵,“_id”,自動添加如果文檔沒有包含一個“_id”鍵?!癬id”的值必須在這個集合是唯一的。insert_one()返回InsertOneResult的一個實例。有關“_id”的更多信息,請參見_id的文檔。
插入第一個文檔后,該帖收集實際上已在服務器上創建。我們可以通過列出所有在我們的數據庫中收集的驗證這一點:
>>> db.collection_names(include_system_collections=False)
Out[6]: [u'posts']
5.2單個文檔的獲取find_one()
查詢最基本的類型,可以在MongoDB中進行的find_one()。該方法返回一個單一的文件匹配查詢(或無,如果沒有匹配),當你知道只有一個匹配的文件,或者只關心在第一文件匹配是非常有用的,使用find_one()來獲得職位收集的頭文件:
In [7]: posts.find_one()
Out[7]:
{u'_id': ObjectId('565583369d00010c0ad19cd6'),
u'author': u'Mike',
u'date': datetime.datetime(2015,11, 25, 9, 45, 22, 80000),
u'tags': [u'mongodb', u'python',u'pymongo'],
u'text': u'My first blog post!'}
Note:上面的結果是一個辭典匹配,先前插入的那個。返回文檔中包含一個“_id”,這是在插入自動添加。
如果嘗試用不同的author,如“Eliot”會得到任何結果:
In [8]: posts.find_one({"author": "Eliot"})
沒有結果;
如果嘗試,“Mike”會得到如下結果:
In [9]: posts.find_one({"author": "Mike"})
Out[9]:
{u'_id': ObjectId('565583369d00010c0ad19cd6'),
u'author': u'Mike',
u'date': datetime.datetime(2015,11, 25, 9, 45, 22, 80000),
u'tags': [u'mongodb', u'python',u'pymongo'],
u'text': u'My first blog post!'}
5.3通過ObjectId查詢
我們也可以找到一個位置由它的_id,這在我們的例子中是一個的ObjectId:
In [10]: post_id
Out[10]: ObjectId('565583369d00010c0ad19cd6')
In [11]: posts.find_one({"_id": post_id})
Out[11]:
{u'_id': ObjectId('565583369d00010c0ad19cd6'),
u'author': u'Mike',
u'date': datetime.datetime(2015,11, 25, 9, 45, 22, 80000),
u'tags': [u'mongodb', u'python',u'pymongo'],
u'text': u'My first blog post!'}
注意,一個ObjectId存在不一樣的字符串表示:
In [13]: post_id_as_str = str(post_id)
posts.find_one({"_id":post_id_as_str}) #
沒有任何結果
在Web應用程序中的一個常見的任務是讓從請求URL中的ObjectId,并找到匹配的文件。有必要在這種情況下將它傳遞到find_one()之前從字符串轉換的ObjectId:
from bson.objectid import ObjectId
# The web framework gets post_id from the URL and passes it as a string
def get(post_id):
# Convert from string toObjectId:
document =client.db.collection.find_one({'_id': ObjectId(post_id)})
5.4 批量插入(Bulk Inserts)
除了插入一個單一的文件,我們也可以執行批量插入操作,通過傳遞列表作為第一個參數insert_many()。這將插入每個文件在列表中,只發送一個命令到服務器:
In [14]:
new_posts = [{"author": "Mike",
"text": "Anotherpost",
"tags":["bulk", "insert"],
"date":datetime.datetime(2009, 11, 12, 11, 14)},
{"author":"Eliot",
"title": "MongoDB isfun",
"text":"and pretty easy too!",
"date":datetime.datetime(2009, 11, 10, 10, 45)}]
result = posts.insert_many(new_posts)
result.inserted_ids
Out[14]:
[ObjectId('565589029d00010c0ad19cd7'), ObjectId('565589029d00010c0ad19cd8')]
Note:有幾個有趣的事情需要注意這個例子:
l從insert_many(),結果返回兩個的ObjectId,而且每一個都插入到了文件。
lnew_posts [ 1 ]都有不同的“tags”比其他位置-沒有“標簽”欄,我們增加了一個新的類,“title”。從這可以看出MongoDB的構架是自由化的,可以自行增加和刪減;
5.5 多文檔查詢
為了獲得更多的比一個單一的文件,因為我們使用find()方法查詢的結果。find()返回游標實例,它允許我們遍歷所有匹配的文件。例如,我們可以遍歷的數據庫收集每一份文件:
In [16]:
for post in posts.find():
print post
{u'date': datetime.datetime(2015, 11, 25, 9, 45, 22, 80000), u'text':u'My first blog post!', u'_id': ObjectId('565583369d00010c0ad19cd6'),u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Anotherpost', u'_id': ObjectId('565589029d00010c0ad19cd7'), u'author': u'Mike',u'tags': [u'bulk', u'insert']}
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'andpretty easy too!', u'_id': ObjectId('565589029d00010c0ad19cd8'), u'author':u'Eliot', u'title': u'MongoDB is fun'}
就像我們用find_one()一樣,我們可以通過find()來限制文檔的返回結果。在這里,我們得到它的作者是“Mike”只有那些文件:
In [17]: for post in posts.find({"author":"Mike"}):
print post
{u'date':datetime.datetime(2015, 11, 25, 9, 45, 22, 80000), u'text': u'My first blogpost!', u'_id': ObjectId('565583369d00010c0ad19cd6'), u'author': u'Mike',u'tags': [u'mongodb', u'python', u'pymongo']}
{u'date': datetime.datetime(2009,11, 12, 11, 14), u'text': u'Another post', u'_id':ObjectId('565589029d00010c0ad19cd7'), u'author': u'Mike', u'tags': [u'bulk',u'insert']}
5.6 范圍查詢
MongoDB的支持許多不同類型的高級查詢。作為一個例子,執行我們結果限制的位置早于某個日期,也由作者對結果進行排序的查詢:
In [20]:
d = datetime.datetime(2009, 11, 12, 12)
for post in posts.find({"date": {"$lt":d}}).sort("author"):
print post
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'andpretty easy too!', u'_id': ObjectId('565589029d00010c0ad19cd8'), u'author':u'Eliot', u'title': u'MongoDB is fun'}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Anotherpost', u'_id': ObjectId('565589029d00010c0ad19cd7'), u'author': u'Mike',u'tags': [u'bulk', u'insert']}
六、簡單的統計
如果我們只是想知道有多少文件匹配,我們可以執行查詢函數count()。得到所有集合中的文件的計數:
In [18]: posts.count()
Out[18]: 3
或者那些符合特定格式的文件:
In [19]: posts.find({"author": "Mike"}).count()
Out[19]: 2
七、刪除文檔
可以使用集合的remove()方法從集合中刪除一個文檔。remove方法和find、find_one一樣,也可以使用一個字典參數來指定哪個文檔需要被刪除。比如,要刪除所有"author"鍵的值為"Mike"的文檔,輸入:
In [26]: posts.remove({"author": "Mike"})
Out[26]: {u'n': 4, u'ok': 1}
In [27]: for nl in posts.find():
print nl
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'andpretty easy too!', u'_id': ObjectId('565589029d00010c0ad19cd8'), u'author':u'Eliot', u'title': u'MongoDB is fun'}
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'andpretty easy too!', u'_id': ObjectId('56559fb89d00010d55ba1d12'), u'author':u'Eliot', u'title': u'MongoDB is fun'}
八、案例解析
8.1常見mongoDB函數的創建集成案例
源碼見附錄;
8.2將10條信息寫入mongdb數據庫的案例
源碼見附錄
注:未經許可不得轉載!