七叶笔记 » 数据库 » MongoDB安装使用并实现Python操作数据库

MongoDB安装使用并实现Python操作数据库

一、MongoDB介绍

MongoDB 是一个是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

二、安装MongoDB

MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。如果网速太差,并且已经下载MongoDB的安装包时,可以离线方式安装,参考Ubuntu下MongoDB安装与使用教程(离线安装方式)。推荐使用apt-get命令进行在线安装,可以避免很多莫名其妙的问题。 以下命令

可下载安装MongoDB,默认安装的版本是MongoDB 2.6.10,但目前MongoDB已经升级到3.2.8,这里将指导读者通过添加软件源的方式来安装3.2.8版本。 首先打开终端,导入公共key到包管理器,输入以下命令:

创建MongoDB的文件列表

注意:如果执行“sudo apt-get update”命令后出现如下错误:

··· update completed, but some metadata was ignored due to errors. E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它? ···

请按照如下方法解决错误,也就是输入以下三条命令:

运行上面三条命令以后,应该就可以顺利完成apt-get update了。

安装完成MongoDB以后,在终端输入以下命令查看MongoDB版本:

输出版本信息,表明安装成功。

启动和关闭mongodb命令如下:

默认设置MongoDB是随Ubuntu启动自动启动的。 输入以下命令查看是否启动成功:

查看是否启动成功

出现安装错误的解决方案: 输入“sudo service mongodb start”启动mongodb的时候,如果报这个错误:Failed to start mongod.service: Unit not found 请按照如下步骤解决该错误: (1)使用vim编辑器创建配置文件

(2)在该配置文件中添加如下内容:

保存退出vim编辑器。 (3)输入如下命令启动mongodb:

这时就可以启动成功了。 以后,每次启动和关闭MongoDB,就可以仍然使用如下命令:

三、使用MongoDB

shell命令模式 输入如下命令进入MongoDB的shell命令模式:

默认连接的数据库是test数据库,在此之前一定要确保你已经启动了MongoDB,否则会出现错误,启动之后运行成功,如下 mongo shell常用操作命令:

MongoDB没有创建数据库的命令,如果你想创建一个“School”的数据库,先运行use School命令,之后做一些操作(如:创建聚集集合db.createCollection(‘teacher')),这样就可以创建一个名叫“School”的数据库。 自动创建school数据库 下面以一个School数据库为例,在School数据库中创建两个集合teacher和student,并对student集合中的数据进行增删改查基本操作(集合Collection相当于关系型数据库中的表table)。

1、切换到School数据库

2、创建集合Collection

本章节我们为大家介绍如何使用 MongoDB 来创建集合。

MongoDB 中使用 createCollection() 方法来创建集合。

语法格式:

参数说明:

name: 要创建的集合名称 options: 可选参数, 指定有关内存大小及索引的选项 options 可以是如下参数: 在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

实例

几种重要的数据类型。 ObjectId ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

前 4 个字节表示创建 unix时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时 接下来的 3 个字节是机器标识码 紧接的两个字节由进程 id 组成 PID 最后三个字节是随机数 MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象

由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:

时间戳 BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的日期类型不相关。 时间戳值是一个 64 位的值。其中:

前32位是一个 time_t 值(与Unix新纪元相差的秒数) 后32位是在某秒中操作的一个递增的序数 在单个 mongod 实例中,时间戳值通常是唯一的。

在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。

BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。

日期 表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。

1、插入数据

与数据库创建类似,插入数据时也会自动创建集合。 插入数据有两种方式:insert和save。

这两种方式,其插入的数据中_id字段均可不写,会自动生成一个唯一的_id来标识本条数据。而insert和save不同之处在于:在手动插入_id字段时,如果_id已经存在,insert不做操作,save做更新操作;如果不加_id字段,两者作用相同点都是插入数据。 insert和save添加的数据其结构是松散的,列属性均不固定,根据添加的数据为准。先定义数据再插入,就可以一次性插入多条数据, 插入多条 运行完以上例子,student 已自动创建,这也说明 MongoDB 不需要预先定义 collection ,在第一次插入数据后,collection 会自动的创建。

2、查找数据

MongoDB 查询文档使用 find() 方法。

find() 方法以非结构化的方式来显示所有文档。

语法 MongoDB 查询数据的语法格式如下:

db.collection.find(query, projection) query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。 如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

>db.col.find().pretty() pretty() 方法以格式化的方式来显示所有文档。

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

MongoDB 与 RDBMS Where 语句比较 如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

 

MongoDB AND 条件 MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。 语法格式如下:

MongoDB OR 条件 MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

AND 和 OR 联合使用 以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘菜鸟教程' OR title = ‘MongoDB 教程')'

3、更新数据

MongoDB 更新文档 MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。

update() 方法 update() 方法用于更新已存在的文档。语法格式如下:

参数说明:

query : update的查询条件,类似sql update查询内where后面的。 update : update的对象和一些更新的操作符(如 set, s e t , inc…)等,也可以理解为sql update查询内set后面的 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 writeConcern :可选,抛出异常的级别。 实例 我们在集合 col 中插入如下数据:

接着我们通过 update() 方法来更新标题(title):

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

save() 方法 save() 方法通过传入的文档来替换已有文档。语法格式如下:

参数说明: document : 文档数据。 writeConcern :可选,抛出异常的级别。 实例 以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:

更多实例 只更新第一条记录:

全部更新:

只添加第一条:

全部添加加进去:

全部更新:

只更新第一条记录:

4、删除数据

在前面的几个章节中我们已经学习了MongoDB中如何为集合添加数据和更新数据。在本章节中我们将继续学习MongoDB集合的删除。

MongoDB remove()函数是用来移除集合中的数据。

MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

语法 remove() 方法的基本语法格式如下所示:

如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:

参数说明: query :(可选)删除的文档的条件。 justOne : (可选)如果设为 true 或 1,则只删除一个文档。 writeConcern :(可选)抛出异常的级别。 实例 以下文档我们执行两次插入操作:

使用 find() 函数查询数据:

5、条件运算符

条件操作符用于比较两个表达式并从mongoDB集合中获取数据。 MongoDB中条件操作符有:

(>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于等于 - $lte

我们使用的数据库名称为”runoob” 我们的集合名称为”col”,以下为我们插入的数据。

为了方便测试,我们可以先使用以下命令清空集合 “col” 的数据:

db.col.remove({}) 插入以下数据

使用find()命令查看数据:

db.col.find()

MongoDB (>) 大于操作符 - $gt 如果你想获取 “col” 集合中 “likes” 大于 100 的数据,你可以使用以下命令:

6、MongoDB Limit与Skip方法

MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

语法 limit()方法基本语法如下所示:

实例 集合 col 中的数据如下:

MongoDB Skip() 方法 我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

7.MongoDB排序

8.MongoDB索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

ensureIndex() 方法 MongoDB使用 ensureIndex() 方法来创建索引。

语法 ensureIndex()方法基本语法格式如下所示:

db.COLLECTION_NAME.ensureIndex({KEY:1}) 语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。

实例

ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。

ensureIndex() 接收可选参数,可选参数列表如下:

 

实例在后台创建索引:

通过在创建索引时加background:true 的选项,让创建工作在后台执行

8.MongoDB 聚合

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

aggregate() 方法 MongoDB中聚合的方法使用aggregate()。

语法 aggregate() 方法的基本语法格式如下所示:

实例

在上面的例子中,我们通过字段by_user字段对数据进行分组,并计算by_user字段相同值的总和。

下表展示了一些聚合的表达式:

 

管道的概念 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。 p r o j e c t : 修 改 输 入 文 档 的 结 构 。 可 以 用 来 重 命 名 、 增 加 或 删 除 域 , 也 可 以 用 于 创 建 计 算 结 果 以 及 嵌 套 文 档 。 match:用于过滤数据,只输出符合条件的文档。 match使用MongoDB的标准查询操作。 m a t c h 使 用 M o n g o D B 的 标 准 查 询 操 作 。 limit:用来限制MongoDB聚合管道返回的文档数。 skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。 s k i p : 在 聚 合 管 道 中 跳 过 指 定 数 量 的 文 档 , 并 返 回 余 下 的 文 档 。 unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。 group:将集合中的文档分组,可用于统计结果。 g r o u p : 将 集 合 中 的 文 档 分 组 , 可 用 于 统 计 结 果 。 sort:将输入文档排序后输出。 $geoNear:输出接近某一地理位置的有序文档。 管道操作符实例

四 Python操作MongoDB

安装PyMongo模块

使用MongoClient建立连接

获取数据库

获取集合

上述任何命令都没有在MongoDB服务器上实际执行任何操作。当第一个文档插入集合时才创建集合和数据库。

插入文档

查找文档

到此这篇关于MongoDB安装使用并实现Python操作数据库 的文章就介绍到这了,更多相关MongoDB安装使用内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章