Python 操作 mongodb 数据库

原文地址: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集合,里面是一些博客文章组成的文档。下面先插入几篇文章做实验。

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

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

posted on 2016-12-23 13:08 Kilichko 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/Yemilice/p/6214438.html

Python 操作 mongodb 数据库相关推荐

  1. Python 操作 MongoDB 数据库!

    作者 |黄伟呢 来源 |数据分析与统计学之美 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 先来看看MySQL与MongoDB 概念区别 ...

  2. java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍

    MongoDB 是一款面向文档型的 NoSQL 数据库,是一个基于分布式文件存储的开源的非关系型数据库系统,其内容是以 K/V 形式存储,结构不固定,它的字段值可以包含其他文档.数组和文档数组等.其采 ...

  3. python操作mongodb数据库

    2019独角兽企业重金招聘Python工程师标准>>> 一.MongoDB 数据库操作 连接数据库 import pymongo conn = pymongo.Connection( ...

  4. python mongodb 异步_【转】Python操作MongoDB数据库

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

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

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

  6. python操作MongoDB数据库(1)查询

    对于用爬虫爬取下来存储到MongoDB数据库中的数据,为了使用这些数据,我们应该得知道一些python对于MongoDB的一些操作.本文只涉及操作,对于数据库的安装和启动暂不涉及.本文参考了他的文章 ...

  7. python操作mongodb数据库-删除集合、集合数据

    删除集合单个文档 使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据. import pymongomyclient = pymongo.MongoCl ...

  8. python 操作mongodb数据库参考文档

    参考文档链接:https://pypi.python.org/pypi/pymongo pymongo的参考文档http://api.mongodb.com/python/current/tutori ...

  9. 用python向mongodb插入数据_Python操作MongoDB数据库(一)

    Python操作MongoDB数据库(一) 前言 干货文章继续出发!隔的时间有些久了哈,对 MongoDB 安装回顾的同学,可以看下windows环境 <初识 MongoDB 数据库>.这 ...

  10. python数据库模糊查询_Python操作mongodb数据库进行模糊查询操作示例

    本文实例讲述了Python操作mongodb数据库进行模糊查询操作.分享给大家供大家参考,具体如下: # -*- coding: utf-8 -*- import pymongo import re ...

最新文章

  1. 砂.随笔.三十二.Together forever and ever
  2. mysql设计的步骤_mysql笔记8_数据库设计步骤
  3. 通过一组RESTful API暴露CQRS系统功能
  4. 01_关于TensorFlow、什么是数据流图(Data Flow Graph)、TensorFlow的特征、谁可以使用Tensorflow、为啥Google要开源这个神器?
  5. 这个公式竟然堪称数学界的画家......
  6. java udp 协议_网络协议 - UDP 协议详解
  7. linux升级openssl需要先卸载吗,在Linux系统上升级OpenSSL的方法
  8. 流API--流的映射
  9. 深入浅出Fetch-API【转】
  10. 基于SEIRD和元胞自动机(CA)模型的传染病发展趋势预测
  11. SSM+垃圾分类小助手 毕业设计-附源码191356
  12. linux 字符终端F1-F6 图形终端F7- F12 简介
  13. 函数重载与参数缺省值共用可能引起两意性
  14. pip 生成 requirement.txt 文件
  15. php 随机字符串函数,PHP 生成随机字符串的方法函数
  16. 【2022国赛模拟】摆(bigben)——行列式、杜教筛
  17. 有衬线字体和无衬线字体
  18. iframe相关,iframe样式
  19. 玩转华为ENSP模拟器系列 | 配置普通NTP对等体模式示例
  20. 会PLC也能玩转机器视觉(二)- 条码识别

热门文章

  1. 【微软力作】虚拟对抗训练:让预训练模型再次强大!
  2. 【中秋快乐】求问meta-learning和few-shot learning的关系是什么?
  3. 【前沿】详细讲解Transformer新型神经网络在机器翻译中的应用
  4. 【万字长文】整理一份全套的机器学习资料!
  5. 分治法经典问题-逆序对个数
  6. 机器学习基础算法18- 鸢尾花数据集分类-随机森林
  7. 全球稀缺的Kaldi学习资料,《Kaldi语音识别实战》给补上了!
  8. 架构整洁之道:优秀设计或多余,有效设计最可取
  9. vSphere及云端计算的完美集成
  10. 如何为自己赢得更好的口碑