设为首页 收藏本站
查看: 1975|回复: 0

[经验分享] Python 操作 mongodb 数据库

[复制链接]

尚未签到

发表于 2017-12-15 11:04:15 | 显示全部楼层 |阅读模式
  原文地址:https://serholiu.com/python-mongodb
  这几天在学习Python Web开发,于 是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样的好玩意儿,何必还自己造车呢?决定使用Tornado这个框架,然后数 据库方面决定顺便熟悉一下MongoDB这样的非关系型数据库。Python让我觉得轻松,再和MongoDB搭配上,那感觉真是好。
  下面就谈谈Python操作MongoDB的一些基本用法,先介绍一下MongoDB,这是现在风头正劲的NoSQL数据库,没有关系数据库那种表 之类的概念,就像Python中的字典一样,一个键对应一个值,然后这些键值组成一个文档,然后文档组成一个集合,集合再组成一个数据库,类型十分丰富, 使用Python操作MongoDB需要安装MongoDB的Python驱动,安装完成后,就可以和我一起开始了。
  启动数据库(具体方法不是本文重点),连接数据库。
  

1  
2
  
3
  
4
  

  

>>> from pymongo import Connection #导入模块  
>>> con = Connection()
  
>>> db = con.test #连接test数据库
  
>>> posts = db.post #连接test中的post集合,相当于MySQL中的表
  

  

  很好的一点就是,数据库不需要先建立,在连接后,如果进行插入数据操作,系统可以自己创建,我们假设一个post集合,里面是一些博客文章组成的文档。下面先插入几篇文章做实验。
  

1  2
  3
  4
  5
  6
  7
  8
  9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  

  

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

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

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

  
>>> posts.insert(post1)
  
>>> posts.insert(post2)
  
>>> posts.insert(post3)
  

  

  在插入一个文档时,MongoDB会自动给每个文档增加一个”_id”的键,这个键是通过复杂计算出来的,不会重复,类似于下面这样的:
  

1  

  

ObjectId('4ea0207dd483050fe8000001')  

  

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

1  
2
  
3
  
4
  

  

>>> posts = posts.find()  
>>> count = posts.count()
  
>>> for post in posts:
  
        print post
  

  

  数据库使用游标来返回find的结果,游标上有多种方法,比如上面的count(),就可以得到查询到的文档总数。这个例子将返回”count=3″和上面的那三篇文档。更多查询方法在后面将讲解,这些方法更加强大。

  插入过后可能发现需要修改,于是下面讲解一些修改的方法。如果需要大幅度的修改,什么是大幅度的修改呢,比如把post1的>  

1  2
  3
  4
  5
  6
  7
  8
  9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  

  

>>> post = posts.find_one({"slug":"python-mongodb"})  
>>> post["author"]
  
u'SErHo'
  
>>> post["author"] = "HaHa Lu"
  
>>> post["title"] = "Test Update"
  
>>> post["title"] = "Test Update"
  
>>> post["_id"]
  
ObjectId('4ea0207dd483050fe8000001')
  
>>> posts.update({"_id":post["_id"]},post)
  
>>> post = posts.find_one({"_id":post["_id"]})
  
>>> print post
  
{u'author': u'HaHa Lu', u'title': u'Test Update',
  
u'tags': [u'Python', u'MongoDB'],
  
u'content': u'Python and MongoDB....',
  
u'time': datetime.datetime(2011, 10, 20, 21, 21, 52, 818000),
  
u'_id': ObjectId('4ea0207dd483050fe8000001'),
  
u'slug': u'python-mongodb'}
  

  

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

1  

  

>>> posts.update({"_id":post["_id"]},{"$set": {"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": {"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”,则如果没有找到匹配的文 档,就会在匹配的基础上新建一个文档,具体实例就不讲了。
  现在使用Python来插入,修改数据已经讲完,后面会继续讲解强大的查询功能和聚合功能。等待下一篇吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424312-1-1.html 上篇帖子: Linux下启动mongodb 下篇帖子: MongoDB查询系统
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表