查看: 5217|回复: 2

Python搭配MongoDB使用方法

[复制链接]
论坛徽章:
65
生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05蓝锆石
日期:2012-04-26 13:39:45开发板块每日发贴之星
日期:2012-04-26 14:03:05ERP板块每日发贴之星
日期:2012-04-26 14:03:05行业板块每日发贴之星
日期:2012-04-26 14:03:05
跳转到指定楼层
1#
发表于 2012-2-29 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在此谈谈Python操作MongoDB的一些基本用法,先介绍一下MongoDB,这是现在风头正劲的NoSQL数据库,没有关系数据库那种表之类的概念,就像Python中的字典一样,一个键对应一个值,然后这些键值组成一个文档,然后文档组成一个集合,集合再组成一个数据库,类型十分丰富,使用Python操作MongoDB需要安装MongoDB的Python驱动,安装完成后,就可以和我一起开始了。

启动数据库(具体方法不是本文重点),连接数据库。

  1. >>> con = Connection()
  2. >>> db = con.test #连接test数据库
  3. >>> posts = db.post #连接test中的post集合,相当于MySQL中的表
复制代码
很好的一点就是,数据库不需要先建立,在连接后,如果进行插入数据操作,系统可以自己创建,我们假设一个post集合,里面是一些博客文章组成的文档。下面先插入几篇文章做实验。

  1. >>> import datetime
  2. >>> post1 = {"title":"I Love Python",
  3. "slug":"i-love-python",
  4. "author":"SErHo",
  5. "content":"I Love Python....",
  6. "tags":["Love","Python"],
  7. "time":datetime.datetime.now()}

  8. >>> post2 = {"title":"Python and MongoDB",
  9. "slug":"python-mongodb",
  10. "author":"SErHo",
  11. "content":"Python and MongoDB....",
  12. "tags":["Python","MongoDB"],
  13. "time":datetime.datetime.now()}

  14. >>> post3 = {"title":"SErHo Blog",
  15. "slug":"serho-blog",
  16. "author":"Akio",
  17. "content":"SErHo Blog is OK....",
  18. "tags":["SErHo","Blog"],
  19. "time":datetime.datetime.now()}

  20. >>> posts.insert(post1)
  21. >>> posts.insert(post2)25 >>> posts.insert(post3)

复制代码
在插入一个文档时,MongoDB会自动给每个文档增加一个”_id”的键,这个键是通过复杂计算出来的,不会重复,类似于下面这样的:
  1. ObjectId('4ea0207dd483050fe8000001')

复制代码
增加数据就是这样的简单,不需要事先定义文档的机构,每个文档的结构也可以不一样,上面我举的例子是一样的,这可以根据实际需求来设置,我这个是为了好讲解下面的。插入过后,肯定最先的是查询,下面查询出post集合里面的所有文档:

  1. >>> posts = posts.find()
  2. >>> count = posts.count()
  3. >>> for post in posts:
  4. print post
复制代码
数据库使用游标来返回find的结果,游标上有多种方法,比如上面的count(),就可以得到查询到的文档总数。这个例子将返回”count=3″和上面的那三篇文档。更多查询方法在后面将讲解,这些方法更加强大。
插入过后可能发现需要修改,于是下面讲解一些修改的方法。如果需要大幅度的修改,什么是大幅度的修改呢,比如把post1的title,slug,author等都修改了,我的理解就是大于一个键的修改就叫大幅修改。修改一个东西,你得先找到他,所以查询方法就很重要了,不幸的是,这个准备后面才将。我们先随便查找一个来修改吧。

  1. >>> post = posts.find_one({"slug":"python-mongodb"})
  2. >>> post["author"]
  3. u'SErHo'
  4. >>> post["author"] = "HaHa Lu"
  5. >>> post["title"] = "Test Update"
  6. >>> post["title"] = "Test Update"
  7. >>> post["_id"]
  8. ObjectId('4ea0207dd483050fe8000001')
  9. >>> posts.update({"_id":post["_id"]},post)
  10. >>> post = posts.find_one({"_id":post["_id"]})
  11. >>> print post
  12. {u'author': u'HaHa Lu', u'title': u'Test Update',
  13. u'tags': [u'Python', u'MongoDB'],
  14. u'content': u'Python and MongoDB....',
  15. u'time': datetime.datetime(2011, 10, 20, 21, 21, 52, 818000),
  16. u'_id': ObjectId('4ea0207dd483050fe8000001'),
  17. u'slug': u'python-mongodb'}

复制代码
首先我们根据slug来获得一篇文章,然后可以通过Python字典访问方法得到键的值,然后重新设置,再对post集合进行更新,在对整个集合进行更新时,你得先匹配要更改的文档,利用_id这个属性来更新是比较常用的方法,因为你其他改了,这个可改不了。在执行update中最常见的错误就是限制的条件找到了多个文档,如果这样,数据库就不会更新这个集合,所有最好使用_id来匹配。
如果只更新一个键呢,那就不用这么大费周折了,可以使用”$set”这个修改器,指定一个键,如果不存在,就可以创建。比如我要继续更新上面那篇文章的content,可以这样做(记住,修改它,必须先找到它,这里我利用上面查询到的_id值来找):

  1. >>> posts.update({"_id":post["_id"]},{"$set":
  2. {"content":"Test Update SET...."}})

复制代码
MongoDB的修改是很强大的,你可以把数据类型也给改了,比如把tags的数组改成普通的字符串。”$set”过后又想删除这个键,可以使用”$unset”。如果我的这个post里面有一个键是views,即文章访问的次数,我想在每次访问这个文章后给它的值增加1,这该怎么办?于是”$inc”修改器出场了,这个可以用来增加已有键的值,如果没有,则创建它,类似的用法是:
  1. >>> posts.update({"_id":post["_id"]},{"$inc": {"views":1}})

复制代码
如果想修改tags这个数组里面的内容怎么办?有一个办法就是用$set整体修改,但只是改里面的一些元素呢,MongoDB准备好了用于数组的修改器。比如,想要在tags里面加一个”Test”,这需要使用”$push”,它可以在数组末尾添加一个元素:
  1. >>> posts.update({"_id":post["_id"]},{"$push":{"tags":"Test"}})

复制代码
为了避免加入了重复的,可以将”$push”改为使用”$addToSet”,如果需要添加多个值,可以配合”$each”来使用,这样就可以添加不重复的进去,如下面:


  1. >>> posts.update({"_id":post["_id"]},{"$addToSet":
  2. {"tags":{"$each":["Python","Each"]}}})

复制代码
说完了添加,下面是删除,可以把数组看成栈和队列,使用”$pop”来操作,比如上面的:
  1. >>> posts.update({"_id":post["_id"]},{"$pop":{"tags":1}})

复制代码
这个会删除tags里面最后一个,改成-1则删除第一个。可以使用”$pull”来删除数组中指定的值,它会删除数组中所有匹配的值。如何修改其中的一个值呢?可以先删除掉,再增加一个进去,还有就是直接定位修改。比如tags数组中,”Python”是第一个,想把它改成”python”,可以通过下标直接选择,就是tags[0],然后使用上面的”$set”等修改器,如果不确定可以使用$来定位:
  1. >>> posts.update({"tags":"MongoDB"},{"$set":{"tags.$":"Hello"}})

复制代码
这个将先搜索tags中满足”MongoDB”的,如果找到,就把它修改为”Hello”。可以看到上面的update这个函数已经有两个参数了,它还有第3个参数upsert,如果设为”True”,则如果没有找到匹配的文档,就会在匹配的基础上新建一个文档,具体实例就不讲了。

此文章来源于http://serholiu.com/python-mongodb
论坛徽章:
0
2#
发表于 2014-5-28 17:11 | 只看该作者
很不错的文章 我先赞一下

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
3#
发表于 2014-6-27 22:35 | 只看该作者
文章质量好

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表