一、MongoDB介绍
MongoDB 是一个是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
二、安装MongoDB
MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。如果网速太差,并且已经下载MongoDB的安装包时,可以离线方式安装,参考Ubuntu下MongoDB安装与使用教程(离线安装方式)。推荐使用apt-get命令进行在线安装,可以避免很多莫名其妙的问题。
以下命令
- sudo apt-get install mongodb
可下载安装MongoDB,默认安装的版本是MongoDB 2.6.10,但目前MongoDB已经升级到3.2.8,这里将指导读者通过添加软件源的方式来安装3.2.8版本。
首先打开终端,导入公共key到包管理器,输入以下命令:
- sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
创建MongoDB的文件列表
- #仅适用于Ubuntu14.04,输入:
- echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
- 更新包管理器,安装MongoDB,输入以下命令:
- sudo apt-get update
- sudo apt-get install -y mongodb-org
注意:如果执行“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/),是否有其他进程正占用它?
···
请按照如下方法解决错误,也就是输入以下三条命令:
- sudo rm /var/cache/apt/archives/lock
- sudo rm /var/lib/dpkg/lock
- sudo apt-get update
运行上面三条命令以后,应该就可以顺利完成apt-get update了。
安装完成MongoDB以后,在终端输入以下命令查看MongoDB版本:
- mongo -version
输出版本信息,表明安装成功。
启动和关闭mongodb命令如下:
- sudo service mongodb start
- sudo service mongodb stop
默认设置MongoDB是随Ubuntu启动自动启动的。
输入以下命令查看是否启动成功:
- pgrep mongo -l #注意:-l是英文字母l,不是阿拉伯数字1
查看是否启动成功
出现安装错误的解决方案:
输入“sudo service mongodb start”启动mongodb的时候,如果报这个错误:Failed to start mongod.service: Unit not found
请按照如下步骤解决该错误:
(1)使用vim编辑器创建配置文件
- sudo vim /etc/systemd/system/mongodb.service
(2)在该配置文件中添加如下内容:
- [Unit]
- Description=High-performance, schema-free document-oriented database
- After=network.target
- [Service]
- User=mongodb
- ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
- [Install]
- WantedBy=multi-user.target
保存退出vim编辑器。
(3)输入如下命令启动mongodb:
- sudo systemctl start mongodb
- sudo systemctl status mongodb
这时就可以启动成功了。
以后,每次启动和关闭MongoDB,就可以仍然使用如下命令:
- sudo service mongodb start
- sudo service mongodb stop
三、使用MongoDB
shell命令模式
输入如下命令进入MongoDB的shell命令模式:
- mongo
- 或者:sudo mongo
默认连接的数据库是test数据库,在此之前一定要确保你已经启动了MongoDB,否则会出现错误,启动之后运行成功,如下
mongo shell常用操作命令:
- 数据库相关
- show dbs:显示数据库列表
- show collections:显示当前数据库中的集合(类似关系数据库中的表table)
- show users:显示所有用户
- use yourDB:切换当前数据库至yourDB
- db.help() :显示数据库操作命令
- db.yourCollection.help() :显示集合操作命令,yourCollection是集合名
MongoDB没有创建数据库的命令,如果你想创建一个“School”的数据库,先运行use School命令,之后做一些操作(如:创建聚集集合db.createCollection(‘teacher')),这样就可以创建一个名叫“School”的数据库。
自动创建school数据库
下面以一个School数据库为例,在School数据库中创建两个集合teacher和student,并对student集合中的数据进行增删改查基本操作(集合Collection相当于关系型数据库中的表table)。
1、切换到School数据库
- use School #切换到School数据库。MongoDB 无需预创建School数据库,在使用时会自动创建
2、创建集合Collection
本章节我们为大家介绍如何使用 MongoDB 来创建集合。
MongoDB 中使用 createCollection() 方法来创建集合。
语法格式:
- db.createCollection(name, options)
参数说明:
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
实例
- 在 test 数据库中创建 runoob 集合:
- > use test
- switched to db test
- > db.createCollection("runoob")
- { "ok" : 1 }
- >
- 如果要查看已有集合,可以使用 show collections 命令:
- > show collections
- runoob
- system.indexes
- 下面是带有几个关键参数的 createCollection() 的用法:
- 创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
- > db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
- { "ok" : 1 }
- >
- 在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
- > db.mycol2.insert({"name" : "菜鸟教程"})
- > show collections
- mycol2
- ...
- ##创建一个聚集集合。MongoDB 其实在插入数据的时候,也会自动创建对应的集合,无需预先创建
几种重要的数据类型。
ObjectId
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:
前 4 个字节表示创建 unix时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
接下来的 3 个字节是机器标识码
紧接的两个字节由进程 id 组成 PID
最后三个字节是随机数
MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
- > var newObject = ObjectId()
- > newObject.getTimestamp()
- ISODate("2017-11-25T07:21:10Z")
- ObjectId 转为字符串
- > newObject.str
- 5a1919e63df83ce79df8b38f
- 字符串
- BSON 字符串都是 UTF-8 编码。
时间戳
BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的日期类型不相关。 时间戳值是一个 64 位的值。其中:
前32位是一个 time_t 值(与Unix新纪元相差的秒数)
后32位是在某秒中操作的一个递增的序数
在单个 mongod 实例中,时间戳值通常是唯一的。
在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。
BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。
日期
表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。
- > var mydate1 = new Date() //格林尼治时间
- > mydate1
- ISODate("2018-03-04T14:58:51.233Z")
- > typeof mydate1
- object
- > var mydate2 = ISODate() //格林尼治时间
- > mydate2
- ISODate("2018-03-04T15:00:45.479Z")
- > typeof mydate2
- object
- 这样创建的时间是日期类型,可以使用 JS 中的 Date 类型的方法。
- 返回一个时间类型的字符串:
- > var mydate1str = mydate1.toString()
- > mydate1str
- Sun Mar 04 2018 14:58:51 GMT+0000 (UTC)
- > typeof mydate1str
- string
- 或者
- > Date()
- Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)
1、插入数据
与数据库创建类似,插入数据时也会自动创建集合。
插入数据有两种方式:insert和save。
- db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) #_id可选
- db.student.save({_id:1, sname: 'zhangsan', sage: 22}) #_id可选
这两种方式,其插入的数据中_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 条件。
语法格式如下:
- db.col.find({key1:value1, key2:value2}).pretty()
MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
- db.col.find(
- {
- $or: [
- {key1: value1}, {key2:value2}
- ]
- }
- ).pretty()
AND 和 OR 联合使用
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘菜鸟教程' OR src="/uploads/allimg/210823/1SUQ949-3.png" />
实例在后台创建索引:
- db.values.ensureIndex({open: 1, close: 1}, {background: true})
通过在创建索引时加background:true 的选项,让创建工作在后台执行
8.MongoDB 聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
aggregate() 方法
MongoDB中聚合的方法使用aggregate()。
语法
aggregate() 方法的基本语法格式如下所示:
- db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
实例
- 集合中的数据如下:
- {
- _id: ObjectId(7df78ad8902c)
- title: 'MongoDB Overview',
- description: 'MongoDB is no sql database',
- by_user: 'runoob.com',
- url: 'http://www.runoob.com',
- tags: ['mongodb', 'database', 'NoSQL'],
- likes: 100
- },
- {
- _id: ObjectId(7df78ad8902d)
- title: 'NoSQL Overview',
- description: 'No sql database is very fast',
- by_user: 'runoob.com',
- url: 'http://www.runoob.com',
- tags: ['mongodb', 'database', 'NoSQL'],
- likes: 10
- },
- {
- _id: ObjectId(7df78ad8902e)
- title: 'Neo4j Overview',
- description: 'Neo4j is no sql database',
- by_user: 'Neo4j',
- url: 'http://www.neo4j.com',
- tags: ['neo4j', 'database', 'NoSQL'],
- likes: 750
- },
- 现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
- ## _id 指定根据那个属性分组
- db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
- {
- "result" : [
- {
- "_id" : "runoob.com",
- "num_tutorial" : 2
- },
- {
- "_id" : "Neo4j",
- "num_tutorial" : 1
- }
- ],
- "ok" : 1
- }
- 以上实例类似sql语句: select by_user, count(*) from mycol group by by_user
在上面的例子中,我们通过字段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:输出接近某一地理位置的有序文档。
管道操作符实例
- 1、$project实例
- db.article.aggregate(
- { $project : {
- title : 1 ,
- author : 1 ,
- }}
- );
- 这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:
- db.article.aggregate(
- { $project : {
- _id : 0 ,
- title : 1 ,
- author : 1
- }});
- 2.$match实例
- db.articles.aggregate( [
- { $match : { score : { $gt : 70, $lte : 90 } } },
- { $group: { _id: null, count: { $sum: 1 } } }
- ] );
- $match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
- 3.$skip实例
- db.article.aggregate(
- { $skip : 5 });
- 经过$skip管道操作符处理后,前五个文档被"过滤"掉。
四 Python操作MongoDB
安装PyMongo模块
- pip install pymongo
使用MongoClient建立连接
- from pymongo import MongoClient
- #链接格式
- mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- mongodb:// 这是固定的格式,必须要指定。
- username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库
- host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
- portX 可选的指定端口,如果不填,默认为27017
- /database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。
- ?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开
- # 以下为三种建立无验证连接的方式
- #client = MongoClient()
- #client = MongoClient('localhost', 27017)
- #client = MongoClient('mongodb://localhost:27017/')
- #建立验证连接
- 使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。输出结果如下所示:
- > mongodb://admin:123456@localhost/
- ...
- 使用用户名和密码连接登陆到指定数据库,格式如下:
- mongodb://admin:123456@localhost/test
获取数据库
- # 以下是两种获取数据库的方式
- db = client.pythondb
- db = client['python-db']
获取集合
- # 以下是两种获取集合的方式
- collection = db.python_collection
- collection = db['python-collection']
上述任何命令都没有在MongoDB服务器上实际执行任何操作。当第一个文档插入集合时才创建集合和数据库。
插入文档
- #!/usr/bin/python3
- #coding=utf-8
- import datetime
- from pymongo import MongoClient
- client = MongoClient()
- db = client.pythondb
- posts = db.posts
- post = {"author": "Maxsu",
- "text": "My first blog post!",
- "tags": ["mongodb", "python", "pymongo"],
- "date": datetime.datetime.utcnow()}
- posts.insert(post)
- # 批量插入,参数为list
- posts.insert_many(new_posts)
查找文档
- #!/usr/bin/python3
- #coding=utf-8
- import datetime
- import pprint
- from pymongo import MongoClient
- client = MongoClient()
- db = client.pythondb
- posts = db.posts
- # 查找单个文档
- print(posts.find_one())
- # 查找多个文档
- for post in posts.find():
- print(post)
- # 计数统计
- print(posts.count())
- print(posts.find({"author": "Maxsu"}).count())
到此这篇关于MongoDB安装使用并实现Python操作数据库 的文章就介绍到这了,更多相关MongoDB安装使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
原文链接:https://blog.csdn.net/jjjndk1314/article/details/80180306