Python+Mongodb 案例解析

本教程适合于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数据库的案例

源码见附录

注:未经许可不得转载!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容