原文地址: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的 title,slug,author等都修改了,我的理解就是大于一个键的修改就叫大幅修改。修改一个东西,你得先找到他,所以查询方法就很重要了,不幸 的是,这个准备后面才将。我们先随便查找一个来修改吧。

 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来插入,修改数据已经讲完,后面会继续讲解强大的查询功能和聚合功能。等待下一篇吧。

Python 操作 mongodb 数据库的更多相关文章

  1. python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战

    python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...

  2. python操作三大主流数据库(9)python操作mongodb数据库③mongodb odm模型mongoengine的使用

    python操作mongodb数据库③mongodb odm模型mongoengine的使用 文档:http://mongoengine-odm.readthedocs.io/guide/ 安装pip ...

  3. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

  4. python操作三大主流数据库(7)python操作mongodb数据库①mongodb的安装和简单使用

    python操作mongodb数据库①mongodb的安装和简单使用 参考文档:中文版:http://www.mongoing.com/docs/crud.html英文版:https://docs.m ...

  5. python 操作mongoDB数据库

    网上关于python 操作mongoDB的相关文章相对不是很多,并且质量也不是很高!下面给出一个完整的 增删改查示例程序! #!/usr/bin/python # -*- coding: utf-8 ...

  6. python操作mongodb数据库

    一.MongoDB 数据库操作 连接数据库 import pymongo conn = pymongo.Connection() # 连接本机数据库 conn = pymongo.Connection ...

  7. 【转】Python操作MongoDB数据库

    前言 MongoDB GUI 工具 PyMongo(同步) Motor(异步) 后记 前言 最近这几天准备介绍一下 Python 与三大数据库的使用,这是第一篇,首先来介绍 MongoDB 吧,,走起 ...

  8. python 操作mongodb数据库模糊查询

    # -*- coding: utf-8 -*-import pymongoimport refrom pymongo import MongoClient #创建连接#10.20.66.106clie ...

  9. python操作MONGODB数据库,提取部分数据再存储

    目标:从一个数据库中提取几个集合中的部分数据,组合起来一共一万条.几个集合,不足一千条数据的集合就全部提取,够一千条的就用一万减去不足一千的,再除以大于一千的集合个数,得到的值即为所需提取文档的个数. ...

随机推荐

  1. left join 条件区别

    t1: num | name-----+------ 1      | a 2      | b 3      | c t2: num | value-----+------- 1  | xxx 3 ...

  2. Openwrt Image Builder/SDK 初探

    image builder和SDK既可以从官网上下载,又可以自己进行编译(make menuconfig).官网上下载的是预先帮你编译好的,这样可以大量节省自己编译源码花的时间,这两个东西相当于半成品 ...

  3. 浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式

    一: WCF的服务端与客户端在通信时有三种模式:请求响应模式.数据报模式和双工通讯模式. 说一下基本知识,  1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契 ...

  4. CI(CodeIgniter)框架入门教程——第二课 初始MVC

    本文转载自:http://www.softeng.cn/?p=53 今天的主要内容是,使用CodeIgniter框架完整的MVC内容来做一个简单的计算器,通过这个计算器,让大家能够体会到我在第一节课中 ...

  5. 用canvas 实现个图片三角化(LOW POLY)效果

    之前无意中看到Ovilia 用threejs做了个LOW POLY,也就是图片平面三角化的效果,觉得很惊艳,然后就自己花了点时间尝试了一下. 我是没怎么用过threejs,所以就直接用canvas的2 ...

  6. SNMP 原理与实战详解

    原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  7. 生产环境下案例 No space left on device (inode使用满的情况)

    第一种情况: 问题: 如果想磁盘写入数据提示如下错误: No space left on device. 通过df -h查看磁盘空间,发现没满,请问可能原因是什么? 解答: 可能是inode数量被消耗 ...

  8. 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型:解决方法

    http://blog.csdn.net/xiaochongchong1248/archive/2009/11/20/4841193.aspx?1271573283 编程环境要求:VS2008/FX2 ...

  9. 修改placehosder

    CSS美化INPUT placeholder效果.CSS代码美化文本框里的placeholder文字. ::selection伪元素 简而言之:单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3 ...

  10. [转]《Hadoop基础教程》之初识Hadoop

    原文地址:http://blessht.iteye.com/blog/2095675 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不 ...