Python连接MongoDB数据库
- 安装MongoDB
- PyMongo的安装
- 直接使用pip安装:
- 利用whl文件安装
- PyMongo的使用
- 使用PyMongo初始化数据库
- 使用PyMongo初始化集合
- 插入数据
- 查找数据
- 逻辑查询
- 对查询结果排序
- 更新记录
- 删除记录
- 对查询结果去重
安装MongoDB
- 在官网上下载MongoDB数据库的安装包,链接为https://www.mongodb.com/download-center/community
。 - 对windows版本来说,安装过程需特别注意的是选择Custom版本而不是Complete版本,并将修改安装路径为E:\mongodb。
- 在E:\mongodb目录下新建用来存放数据的文件夹E:\mongodb\data,用来存放日志的文件夹E:\mongodb\logs,用来存放数据库文件的文件夹E:\mongodb\data\db。
- 启动命令行,进入E:\mongodb\bin目录,输入以下命令使得操作系统自动启动MongoDB.exe。
mongod --dbpath "E:\mongodb\data\db" --logpath "E:\mongodb\data\logs\MongoDB.log" --install --serviceName "MongoDB"
- 接着在命令行的E:\mongodb\bin目录目录下以管理员身份运行以下代码,启动MongoDB服务。
net start MongoDB
- 关闭服务的操作命令为
net stop MongoDB
PyMongo的安装
PyMongo库是Python对MongoDB操作的接口包,能够实现对MongoDB的增删改查及排序等操作。
直接使用pip安装:
pip install pymongo
利用whl文件安装
直接使用pip安装可能会遇到网络问题导致安装失败,因此,对于Windows系统可以访问http://www.lfd.uci.edu/~gohlke/pythonlibs/
。
在这个网站上找到PyMongo,并将whl包下载到本地,然后使用以下命令安装:
pip install 下载下来的whl文件名
PyMongo的使用
使用PyMongo初始化数据库
要使用PyMongo操作MongoDB,首先需要初始化数据库连接。如果MongoDB运行在本地计算机上,而且也没有修改端口或者添加用户名及密码,那么初始化MongoClient的实例的时候可直接写为:
import pymongo
client = pymongo.MongoClient(host = 'localhost', port = 27017)
如果MongoDB是运行在其他服务器上面的,那么就需要使用“URI(Uniform Resource Identifier,统一资源标志符)”来指定连接地址。MongoDB URI的格式为:
mongodb://用户名:密码@服务器IP或域名:端口
例如
import pymongo
client = pymongo.MongoClient('kingname:12345@45.76.110.210:27019')
无需权限认证时可以写为:
import pymongo
client = pymongo.MongoClient('mongodb://45.76.110.210:27019')
使用PyMongo初始化集合
有以下两种方式获取数据库和集合
#方式1
db = client['github']
collection = db['repo']
#方式2
db = client.github
collection = db.repo
插入数据
MongoDB的插入操作非常简单。用到的方法为insert_one(参数),插入的参数就是Python的字典。插入一条数据的代码如下。
import pymongo
client = pymongo.MongoClient(host = 'localhost', port = 27017)
db = client['sample']
collection = db['inf']
data = {'id': 123, 'name': 'kingname', 'age': 20, 'salary': 999999}
collection.insert_one(data)
将多个字典放入列表中,并将列表作为insert_many()方法的参数,即可实现批量插入数据,代码如下。
more_data = [
{'id': 2, 'name': '张三', 'age': 10, 'salary': 0},
{'id': 3, 'name': '李四', 'age': 30, 'salary': -100},
{'id': 4, 'name': '王五', 'age': 40, 'salary': 1000},
{'id': 5, 'name': '外国人', 'age': 50, 'salary': '未知'}]
collection.insert_many(more_data)
查找数据
MongoDB的查找功能对应的方法是:
find(查询条件,返回字段)
find_one(查询条件,返回字段)
两个参数的类型均为Python字典,参数可以省略。其中,find_one()一次只返回一条信息。因此用得最多的是find()这个方法。
普通查询方法有以下3种写法。
content = collection.find()
content = collection.find({'age': 29})
content = collection.find({'age': 29}, {'_id': 0,'name': 1, 'salary': 1})
在不写find()方法的参数时,表示获取指定集合中所有内容的所有字段。
find()方法的第2个参数指定返回内容。这个参数是一个字典,Key就是字段的名称,Value是0或者1,0表示不返回这个字段,1表示返回这个字段。其中_id比较特殊,必须人工指定它的值为0,这样才不会返回。而对于其他数据,应该统一使用返回,或者统一使用不返回。
collection.find({}, {'name': 1, 'salary': 1})
collection.find({}, {'age': 0})
只有_id是一个例外,必须要指定“’_id’: 0”,才不会返回,否则默认都要返回。下面以一个列表推导式为例:
content = [x for x in collection.find({'age': 29}, {'_id': 0, 'name': 1, 'salary': 1})]
find()方法返回的是一个可以迭代的PyMongo对象,这个对象可以被for循环展开。展开以后可以得到很多个字典。每个字典对应一条记录。所以这个列表推导式也可以改写为for循环:
content_obj = collection.find({'age': 29}, {'_id': 0, 'name': 1, 'salary': 1})
content = []
for each in content_obj:
content.append(each)
逻辑查询
PyMongo也支持大于、小于、大于等于、小于等于、等于、不等于这类逻辑查询。
符号 | 意义 |
---|---|
$gt | 大于 |
$lt | 小于 |
$gte | 大于等于 |
$lte | 小于等于 |
$eq | 等于 |
$ne | 不等于 |
它们的用法用一个例子来说明:
collection.find({'age': {'$gt': 29}}) #查询所有age > 29的记录
collection.find({'age': {'$gte':29, '$lte':40}}) #查询29 ≤ age ≤ 40的记录
collection.find({'salary': {'$ne: 29}}) #查询所有salary不等于29的记录
对查询结果排序
MongoDB支持对查询到的结果进行排序。排序的方法为sort()。它的格式为:
handler.find().sort('列名', 1或-1)
查询一般和find()配合在一起使用。例如:
collection.find({'age': {'$gte': 29, '$lte': 40}}).sort('age', -1)
collection.find({'age': {'$gte': 29, '$lte': 40}}).sort('age', 1)
首先查询所有年龄大于等于29岁、小于等于40岁的记录,然后按年龄来进行排序。sort()方法接收两个参数:第1个参数指明需要以哪一项进行排序;第2个参数-1表示降序,1表示升序。
更新记录
更新可使用update_one()和update_many()方法。它们的格式为:
collection.update_one(参数1, 参数2)
collection.update_many(参数1, 参数2)
前者只更新一条信息,后者更新所有符合要求的信息。这里的参数1和参数2都是字典,都不能省略。参数1用来寻找需要更新的记录,参数2用来更新记录的内容。例如:
#将第1个年龄为20岁的人的名字改为kingname
col.update_one({'age': 20}, {'$set':{'name': 'kingname'}})
#将所有年龄为20岁的人的年龄全部改为30
col.update_many({'age': 20}, {'$set':{'age': 30}})
删除记录
删除可使用delete_one()和delete_many()方法。它们的格式为:
collection.delete_one(参数)
collection.delete_many(参数)
这里的参数都是字典,不建议省略。delete_one()方法只删除一条记录,delete_many()删除所有符合要求的记录。
例如:
#删除第1个名字叫作kingname的人
collection.delete_one({'name': 'kingname'})
#删除所有名字叫作kingname的人
collection.delete_many({'name': 'kingname'})
对查询结果去重
去重使用distinct()方法,其格式为:
collection.distinct('列名')
这个方法返回一个去重后的列表。
参考书籍:
《Python爬虫开发:从入门到实践》
《NoSQL数据库入门与实践》