PyMongo Tutorial 學(xué)習(xí)筆記

Python訪問Mongodb數(shù)據(jù)庫是通過PyMongo庫來實(shí)現(xiàn)的。通過閱讀官方的Tutorial整理翻譯得到這份筆記团赏。

開始之前當(dāng)然要導(dǎo)入模塊啦:

>>> import pymongo

下一步运翼,必須本地mongodb服務(wù)器的安裝和啟動(dòng)已經(jīng)完成岁钓,才能繼續(xù)下去激涤。

建立于MongoClient 的連接:

client = MongoClient('localhost', 27017)
# 或者
client = MongoClient('mongodb://localhost:27017/')

得到數(shù)據(jù)庫:

>>> db = client.test_database
# 或者
>>> db = client['test-database']

得到一個(gè)數(shù)據(jù)集合:

collection = db.test_collection
# 或者
collection = db['test-collection']

MongoDB中的數(shù)據(jù)使用的是類似Json風(fēng)格的文檔:

>>> import datetime
>>> post = {"author": "Mike",
...         "text": "My first blog post!",
...         "tags": ["mongodb", "python", "pymongo"],
...         "date": datetime.datetime.utcnow()}

插入一個(gè)文檔:

>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId('...')

找一條數(shù)據(jù):

>>> posts.find_one()
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

>>> posts.find_one({"author": "Mike"})
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

>>> posts.find_one({"author": "Eliot"})
>>>

通過ObjectId來查找:

>>> post_id
ObjectId(...)
>>> posts.find_one({"_id": post_id})
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

不要轉(zhuǎn)化ObjectId的類型為String:

>>> post_id_as_str = str(post_id)
>>> posts.find_one({"_id": post_id_as_str}) # No result
>>>

如果你有一個(gè)post_id字符串,怎么辦呢累提?

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 to ObjectId:
    document = client.db.collection.find_one({'_id': ObjectId(post_id)})

多條插入:

>>> new_posts = [{"author": "Mike",
...               "text": "Another post!",
...               "tags": ["bulk", "insert"],
...               "date": datetime.datetime(2009, 11, 12, 11, 14)},
...              {"author": "Eliot",
...               "title": "MongoDB is fun",
...               "text": "and pretty easy too!",
...               "date": datetime.datetime(2009, 11, 10, 10, 45)}]
>>> result = posts.insert_many(new_posts)
>>> result.inserted_ids
[ObjectId('...'), ObjectId('...')]

查找多條數(shù)據(jù):

>>> for post in posts.find():
...   post
...
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), 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('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}

當(dāng)然也可以約束查找條件:

>>> for post in posts.find({"author": "Mike"}):
...   post
...
{u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), 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('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

獲取集合的數(shù)據(jù)條數(shù):

>>> posts.count()
3

或者說滿足某種查找條件的數(shù)據(jù)條數(shù):

>>> posts.find({"author": "Mike"}).count()
2

范圍查找尘喝,比如說時(shí)間范圍:

>>> 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'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
{u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

$lt是小于的意思。

如何建立索引呢刻恭?比如說下面這個(gè)查找:

>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BasicCursor'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
3

建立索引:

>>> from pymongo import ASCENDING, DESCENDING
>>> posts.create_index([("date", DESCENDING), ("author", ASCENDING)])
u'date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BtreeCursor date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
2

現(xiàn)在對(duì)于date和author已經(jīng)建立的B樹的索引了瞧省。
ei

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扯夭,一起剝皮案震驚了整個(gè)濱河市鳍贾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌交洗,老刑警劉巖骑科,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異构拳,居然都是意外死亡咆爽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門置森,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斗埂,“玉大人,你說我怎么就攤上這事凫海∏盒祝” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵行贪,是天一觀的道長(zhǎng)漾稀。 經(jīng)常有香客問我,道長(zhǎng)建瘫,這世上最難降的妖魔是什么崭捍? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮啰脚,結(jié)果婚禮上殷蛇,老公的妹妹穿的比我還像新娘。我一直安慰自己橄浓,他們只是感情好粒梦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贮配,像睡著了一般谍倦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泪勒,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天昼蛀,我揣著相機(jī)與錄音宴猾,去河邊找鬼。 笑死叼旋,一個(gè)胖子當(dāng)著我的面吹牛仇哆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夫植,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讹剔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了详民?” 一聲冷哼從身側(cè)響起延欠,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沈跨,沒想到半個(gè)月后由捎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饿凛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年狞玛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涧窒。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡心肪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纠吴,到底是詐尸還是另有隱情硬鞍,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布呜象,位于F島的核電站膳凝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恭陡。R本人自食惡果不足惜蹬音,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望休玩。 院中可真熱鬧著淆,春花似錦、人聲如沸拴疤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呐矾。三九已至苔埋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜒犯,已是汗流浹背组橄。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工荞膘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玉工。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓羽资,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親遵班。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屠升,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容