热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Python程序中使用MongoDB数据库

下面就谈谈Python操作MongoDB的一些基本用法,先介绍一下MongoDB,这是现在风头正劲的NoSQL数据库,没有关系数据库那种表之类的概念,就像Python中的字典一样,一个键对应一个值,然后这些键值组成一个文档,然后文档组成一个集合,集合再组成一个数据库,类

下面就谈谈Python操作MongoDB的一些基本用法,先介绍一下MongoDB,这是现在风头正劲的NoSQL数据库,没有关系数据库那种表之类的概念,就像Python中的字典一样,一个键对应一个值,然后这些键值组成一个文档,然后文档组成一个集合,集合再组成一个数据库,类型十分丰富,使用Python操作MongoDB需要安装MongoDB的Python驱动,安装完成后,就可以和我一起开始了。

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

1     >>> from pymongo import Connection #导入模块
2     >>> con = Connection()
3     >>> db = con.test #连接test数据库
4     >>> 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
 9     >>> post2 = {"title":"Python and MongoDB",
10          "slug":"python-mongodb",
11          "author":"SErHo",
12          "content":"Python and MongoDB....",
13          "tags":["Python","MongoDB"],
14          "time":datetime.datetime.now()}
15
16     >>> post3 = {"title":"SErHo Blog",
17          "slug":"serho-blog",
18          "author":"Akio",
19          "content":"SErHo Blog is OK....",
20          "tags":["SErHo","Blog"],
21          "time":datetime.datetime.now()}
22
23     >>> posts.insert(post1)
24     >>> posts.insert(post2)
25     >>> posts.insert(post3)

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

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

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

插入过后可能发现需要修改,于是下面讲解一些修改的方法。如果需要大幅度的修改,什么是大幅度的修改呢,比如把post1的title,slug,author等都修改了,我的理解就是大于一个键的修改就叫大幅修改。修改一个东西,你得先找到他,所以查询方法就很重要了,不幸的是,这个准备后面才将。我们先随便查找一个来修改吧。

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

首先我们根据slug来获得一篇文章,然后可以通过Python字典访问方法得到键的值,然后重新设置,再对post集合进行更新,在对整个集合进行更新时,你得先匹配要更改的文档,利用_id这个属性来更新是比较常用的方法,因为你其他改了,这个可改不了。在执行update中最常见的错误就是限制的条件找到了多个文档,如果这样,数据库就不会更新这个集合,所有最好使用_id来匹配。

如果只更新一个键呢,那就不用这么大费周折了,可以使用”$set”这个修改器,指定一个键,如果不存在,就可以创建。比如我要继续更新上面那篇文章的content,可以这样做(记住,修改它,必须先找到它,这里我利用上面查询到的_id值来找):

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

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

     >>>  "n">posts. "n">update "p">({"_id": "n">post "p">["_id" "p">]},{"$inc" "p">:   "p">{"views" "p">:}})

如果想修改tags这个数组里面的内容怎么办?有一个办法就是用$set整体修改,但只是改里面的一些元素呢,MongoDB准备好了用于数组的修改器。比如,想要在tags里面加一个”Test”,这需要使用”$push”,它可以在数组末尾添加一个元素:

     >>>  "n">posts. "n">update "p">({"_id": "n">post "p">["_id" "p">]},{"$push" "p">:{"tags" "p">:"Test"}})

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

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

说完了添加,下面是删除,可以把数组看成栈和队列,使用”$pop”来操作,比如上面的:

     >>>  "n">posts. "n">update "p">({"_id": "n">post "p">["_id" "p">]},{"$pop" "p">:{"tags" "p">:}})

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

     >>>  "n">posts. "n">update "p">({"tags" "p">:"MongoDB" "p">},{"$set" "p">:{"tags.$" "p">:"Hello"}})

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

现在使用Python来插入,修改数据已经讲完,后面会继续讲解强大的查询功能和聚合功能。等待下一篇吧。


推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 近期参与了一个旨在提高在线平台大规模查询响应速度的项目,预计处理的数据量为2-3亿条,数据库并发量约为每秒1500次,未来可能增至3000次。通过对比Redis和MongoDB,最终选择了MongoDB,因其具备优秀的横向扩展性和GridFS支持下的Map/Reduce功能。 ... [详细]
  • 本文详细介绍了如何构建MongoDB的ReplSet复制集群,包括环境准备、配置文件设置以及初始化复制集群的具体步骤。 ... [详细]
  • 开发笔记:Mongodb副本集集群搭建 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
author-avatar
幼俐佩其392
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有