Python 操作 mongodb 数据库
原文地址:https://serholiu.com/python-mongodb
这几天在学习Python Web开发,于 是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样的好玩意儿,何必还自己造车呢?决定使用Tornado这个框架,然后数 据库方面决定顺便熟悉一下MongoDB这样的非关系型数据库。Python让我觉得轻松,再和MongoDB搭配上,那感觉真是好。
下面就谈谈Python操作MongoDB的一些基本用法,先介绍一下MongoDB,这是现在风头正劲的NoSQL数据库,没有关系数据库那种表 之类的概念,就像Python中的字典一样,一个键对应一个值,然后这些键值组成一个文档,然后文档组成一个集合,集合再组成一个数据库,类型十分丰富, 使用Python操作MongoDB需要安装MongoDB的Python驱动,安装完成后,就可以和我一起开始了。
启动数据库(具体方法不是本文重点),连接数据库。
1 |
>>> from pymongo import Connection #导入模块 |
很好的一点就是,数据库不需要先建立,在连接后,如果进行插入数据操作,系统可以自己创建,我们假设一个post集合,里面是一些博客文章组成的文档。下面先插入几篇文章做实验。
1 |
>>> import datetime |
在插入一个文档时,MongoDB会自动给每个文档增加一个”_id”的键,这个键是通过复杂计算出来的,不会重复,类似于下面这样的:
1 |
ObjectId('4ea0207dd483050fe8000001')
|
增加数据就是这样的简单,不需要事先定义文档的机构,每个文档的结构也可以不一样,上面我举的例子是一样的,这可以根据实际需求来设置,我这个是为了好讲解下面的。插入过后,肯定最先的是查询,下面查询出post集合里面的所有文档:
1 |
>>> posts = posts.find() |
数据库使用游标来返回find的结果,游标上有多种方法,比如上面的count(),就可以得到查询到的文档总数。这个例子将返回”count=3″和上面的那三篇文档。更多查询方法在后面将讲解,这些方法更加强大。
插入过后可能发现需要修改,于是下面讲解一些修改的方法。如果需要大幅度的修改,什么是大幅度的修改呢,比如把post1的 title,slug,author等都修改了,我的理解就是大于一个键的修改就叫大幅修改。修改一个东西,你得先找到他,所以查询方法就很重要了,不幸 的是,这个准备后面才将。我们先随便查找一个来修改吧。
1 |
>>> post = posts.find_one({"slug":"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 数据库的更多相关文章
- python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战
python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...
- python操作三大主流数据库(9)python操作mongodb数据库③mongodb odm模型mongoengine的使用
python操作mongodb数据库③mongodb odm模型mongoengine的使用 文档:http://mongoengine-odm.readthedocs.io/guide/ 安装pip ...
- python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查
python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...
- python操作三大主流数据库(7)python操作mongodb数据库①mongodb的安装和简单使用
python操作mongodb数据库①mongodb的安装和简单使用 参考文档:中文版:http://www.mongoing.com/docs/crud.html英文版:https://docs.m ...
- python 操作mongoDB数据库
网上关于python 操作mongoDB的相关文章相对不是很多,并且质量也不是很高!下面给出一个完整的 增删改查示例程序! #!/usr/bin/python # -*- coding: utf-8 ...
- python操作mongodb数据库
一.MongoDB 数据库操作 连接数据库 import pymongo conn = pymongo.Connection() # 连接本机数据库 conn = pymongo.Connection ...
- 【转】Python操作MongoDB数据库
前言 MongoDB GUI 工具 PyMongo(同步) Motor(异步) 后记 前言 最近这几天准备介绍一下 Python 与三大数据库的使用,这是第一篇,首先来介绍 MongoDB 吧,,走起 ...
- python 操作mongodb数据库模糊查询
# -*- coding: utf-8 -*-import pymongoimport refrom pymongo import MongoClient #创建连接#10.20.66.106clie ...
- python操作MONGODB数据库,提取部分数据再存储
目标:从一个数据库中提取几个集合中的部分数据,组合起来一共一万条.几个集合,不足一千条数据的集合就全部提取,够一千条的就用一万减去不足一千的,再除以大于一千的集合个数,得到的值即为所需提取文档的个数. ...
随机推荐
- Vue系列: 如何通过组件的属性props设置样式
比如我们要在vue中显示百度地图,然后将相关的代码包装成组件,然后需要由外部来设置组件的高度,关于props的介绍,可以参考: http://cn.vuejs.org/guide/components ...
- Webwork 学习之路【01】Webwork与 Struct 的前世今生
Struts 1是全世界第一个发布的MVC框架,它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,Struts ...
- NetworkSocket结构图
分层思想 NetworkSocket使用分层的思想,分基础层和上层: 1.基础层提供基础通讯,重要的对象有SessionBase.TcpServerBase和TcpClientBase: 2.上层实现 ...
- 与TCP/IP协议的初次见面(一)
引言 最近LZ有了一点时间,于是便拿出TCP/IP的书本开始啃.开始的时候,啃起来枯燥无味,现在好不容易有点开窍,于是赶忙记录一下,生怕自己一转眼就给忘了.不过计算机系统原理就有点可惜了,最近一直没时 ...
- 【JavaEE企业应用实战学习记录】servlet3.0上传文件
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2016/10/6 Time: 14:20 To change this tem ...
- strut2的拦截器之对request和session的封装
本文主要内容是对 implements Interceptor 这种方式的探索 前提是需要了解:责任链模式 对下面这句代码的理解: Map<String, Object> session ...
- js原型继承的几种方式
1. 原型链继承 2,构造函数继承(对象冒充继承) 3,组合继承(原型链继承+构造函数继承) 4,原型式继承 5. 寄生组合式继承 一.原型链继承 function Show(){ this.name ...
- extJs学习基础
显示和隐藏 所有的组件都是在show和hide方法中构造的.用来隐藏组件的默认的css方法是“display:none”但是通过hidemode配置的时候就有所变化了: Ext.onReady(fun ...
- 在Ubuntu 14.04中安装最新版Eclipse
1.下载eclipse从官网http://www.eclipse.org/downloads/下载Eclipse IDE for Java EE Developers的Linux版本eclipse-S ...
- curl operate elasticsearch
export elasticsearchwebaddress=localhost:9200# 1. Add documentcurl -X PUT "$elasticsearchwebadd ...